@sumicom/quicksave 0.6.1 → 0.6.2

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 (89) hide show
  1. package/dist/ai/cardBuilder.d.ts +14 -3
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +219 -66
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +2 -0
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +81 -20
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/claudeCodeProvider.d.ts +18 -0
  10. package/dist/ai/claudeCodeProvider.d.ts.map +1 -0
  11. package/dist/ai/claudeCodeProvider.js +30 -0
  12. package/dist/ai/claudeCodeProvider.js.map +1 -0
  13. package/dist/ai/claudeSdkProvider.d.ts +2 -0
  14. package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
  15. package/dist/ai/claudeSdkProvider.js +13 -3
  16. package/dist/ai/claudeSdkProvider.js.map +1 -1
  17. package/dist/ai/codexMcpProvider.d.ts +15 -0
  18. package/dist/ai/codexMcpProvider.d.ts.map +1 -0
  19. package/dist/ai/codexMcpProvider.js +442 -0
  20. package/dist/ai/codexMcpProvider.js.map +1 -0
  21. package/dist/ai/codexSdkProvider.d.ts +35 -0
  22. package/dist/ai/codexSdkProvider.d.ts.map +1 -0
  23. package/dist/ai/codexSdkProvider.js +422 -0
  24. package/dist/ai/codexSdkProvider.js.map +1 -0
  25. package/dist/ai/debugLogger.d.ts +24 -0
  26. package/dist/ai/debugLogger.d.ts.map +1 -0
  27. package/dist/ai/debugLogger.js +55 -0
  28. package/dist/ai/debugLogger.js.map +1 -0
  29. package/dist/ai/provider.d.ts +4 -1
  30. package/dist/ai/provider.d.ts.map +1 -1
  31. package/dist/ai/sessionManager.d.ts +13 -8
  32. package/dist/ai/sessionManager.d.ts.map +1 -1
  33. package/dist/ai/sessionManager.js +148 -27
  34. package/dist/ai/sessionManager.js.map +1 -1
  35. package/dist/config.d.ts +1 -0
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +12 -0
  38. package/dist/config.js.map +1 -1
  39. package/dist/connection/connection.d.ts +1 -0
  40. package/dist/connection/connection.d.ts.map +1 -1
  41. package/dist/connection/connection.js +19 -1
  42. package/dist/connection/connection.js.map +1 -1
  43. package/dist/git/operations.d.ts +20 -0
  44. package/dist/git/operations.d.ts.map +1 -1
  45. package/dist/git/operations.js +52 -0
  46. package/dist/git/operations.js.map +1 -1
  47. package/dist/handlers/messageHandler.d.ts +16 -0
  48. package/dist/handlers/messageHandler.d.ts.map +1 -1
  49. package/dist/handlers/messageHandler.js +289 -19
  50. package/dist/handlers/messageHandler.js.map +1 -1
  51. package/dist/index.js +22 -2
  52. package/dist/index.js.map +1 -1
  53. package/dist/service/debugHttpServer.d.ts +27 -0
  54. package/dist/service/debugHttpServer.d.ts.map +1 -0
  55. package/dist/service/debugHttpServer.js +189 -0
  56. package/dist/service/debugHttpServer.js.map +1 -0
  57. package/dist/service/ipcClient.js +1 -1
  58. package/dist/service/run.d.ts.map +1 -1
  59. package/dist/service/run.js +21 -1
  60. package/dist/service/run.js.map +1 -1
  61. package/package.json +4 -2
  62. package/dist/ai/asyncQueue.test.d.ts +0 -2
  63. package/dist/ai/asyncQueue.test.d.ts.map +0 -1
  64. package/dist/ai/asyncQueue.test.js +0 -56
  65. package/dist/ai/asyncQueue.test.js.map +0 -1
  66. package/dist/ai/sessionStore.test.d.ts +0 -2
  67. package/dist/ai/sessionStore.test.d.ts.map +0 -1
  68. package/dist/ai/sessionStore.test.js +0 -99
  69. package/dist/ai/sessionStore.test.js.map +0 -1
  70. package/dist/connection/pubsub.test.d.ts +0 -2
  71. package/dist/connection/pubsub.test.d.ts.map +0 -1
  72. package/dist/connection/pubsub.test.js +0 -96
  73. package/dist/connection/pubsub.test.js.map +0 -1
  74. package/dist/git/operations.test.d.ts +0 -2
  75. package/dist/git/operations.test.d.ts.map +0 -1
  76. package/dist/git/operations.test.js +0 -300
  77. package/dist/git/operations.test.js.map +0 -1
  78. package/dist/handlers/messageHandler.test.d.ts +0 -2
  79. package/dist/handlers/messageHandler.test.d.ts.map +0 -1
  80. package/dist/handlers/messageHandler.test.js +0 -361
  81. package/dist/handlers/messageHandler.test.js.map +0 -1
  82. package/dist/service/ipc.test.d.ts +0 -2
  83. package/dist/service/ipc.test.d.ts.map +0 -1
  84. package/dist/service/ipc.test.js +0 -140
  85. package/dist/service/ipc.test.js.map +0 -1
  86. package/dist/service/singleton.test.d.ts +0 -2
  87. package/dist/service/singleton.test.d.ts.map +0 -1
  88. package/dist/service/singleton.test.js +0 -39
  89. package/dist/service/singleton.test.js.map +0 -1
@@ -1,361 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { MessageHandler } from './messageHandler.js';
3
- import { createMessage } from '@sumicom/quicksave-shared';
4
- import { mkdir, writeFile, rm, readFile } from 'fs/promises';
5
- import { join } from 'path';
6
- import { tmpdir } from 'os';
7
- import { simpleGit } from 'simple-git';
8
- describe('MessageHandler', () => {
9
- let testRepoPath;
10
- let handler;
11
- let defaultBranch;
12
- beforeEach(async () => {
13
- // Create temporary test repo
14
- testRepoPath = join(tmpdir(), `quicksave-handler-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
15
- await mkdir(testRepoPath, { recursive: true });
16
- // Initialize git repo
17
- const git = simpleGit(testRepoPath);
18
- await git.init();
19
- await git.addConfig('user.email', 'test@test.com');
20
- await git.addConfig('user.name', 'Test User');
21
- // Create initial commit
22
- await writeFile(join(testRepoPath, 'README.md'), '# Test Repo\n');
23
- await git.add('README.md');
24
- await git.commit('Initial commit');
25
- // Get the default branch name (could be 'main' or 'master' depending on git config)
26
- const status = await git.status();
27
- defaultBranch = status.current || 'main';
28
- handler = new MessageHandler([{ path: testRepoPath, name: 'test-repo' }]);
29
- });
30
- afterEach(async () => {
31
- try {
32
- await rm(testRepoPath, { recursive: true, force: true });
33
- }
34
- catch {
35
- // Ignore cleanup errors
36
- }
37
- });
38
- describe('handleMessage - ping/pong', () => {
39
- it('should respond to ping with pong', async () => {
40
- const message = createMessage('ping', { timestamp: Date.now() });
41
- const response = await handler.handleMessage(message);
42
- expect(response.type).toBe('pong');
43
- expect(response.payload).toHaveProperty('timestamp');
44
- });
45
- });
46
- describe('handleMessage - handshake', () => {
47
- it('should respond to handshake with ack', async () => {
48
- const message = createMessage('handshake', { publicKey: 'test-key' });
49
- const response = await handler.handleMessage(message);
50
- expect(response.type).toBe('handshake:ack');
51
- expect(response.id).toBe(message.id);
52
- expect(response.payload.success).toBe(true);
53
- expect(response.payload.agentVersion).toBe('0.6.1');
54
- expect(response.payload.repoPath).toBe(testRepoPath);
55
- });
56
- });
57
- describe('handleMessage - git:status', () => {
58
- it('should return git status', async () => {
59
- const message = createMessage('git:status', {});
60
- const response = await handler.handleMessage(message);
61
- expect(response.type).toBe('git:status:response');
62
- expect(response.id).toBe(message.id);
63
- const payload = response.payload;
64
- expect(payload.branch).toBe(defaultBranch);
65
- expect(Array.isArray(payload.staged)).toBe(true);
66
- expect(Array.isArray(payload.unstaged)).toBe(true);
67
- expect(Array.isArray(payload.untracked)).toBe(true);
68
- });
69
- it('should detect changes in status', async () => {
70
- await writeFile(join(testRepoPath, 'newfile.txt'), 'content');
71
- const message = createMessage('git:status', {});
72
- const response = await handler.handleMessage(message);
73
- const payload = response.payload;
74
- expect(payload.untracked).toContain('newfile.txt');
75
- });
76
- });
77
- describe('handleMessage - git:diff', () => {
78
- it('should return diff for modified file', async () => {
79
- await writeFile(join(testRepoPath, 'README.md'), '# Modified\n');
80
- const message = createMessage('git:diff', { path: 'README.md', staged: false });
81
- const response = await handler.handleMessage(message);
82
- expect(response.type).toBe('git:diff:response');
83
- expect(response.id).toBe(message.id);
84
- const payload = response.payload;
85
- expect(payload.path).toBe('README.md');
86
- expect(payload.hunks.length).toBeGreaterThan(0);
87
- });
88
- });
89
- describe('handleMessage - git:stage', () => {
90
- it('should stage files successfully', async () => {
91
- await writeFile(join(testRepoPath, 'newfile.txt'), 'content');
92
- const message = createMessage('git:stage', { paths: ['newfile.txt'] });
93
- const response = await handler.handleMessage(message);
94
- expect(response.type).toBe('git:stage:response');
95
- expect(response.payload.success).toBe(true);
96
- // Verify file was staged
97
- const statusMsg = createMessage('git:status', {});
98
- const statusResp = await handler.handleMessage(statusMsg);
99
- const status = statusResp.payload;
100
- expect(status.staged.some((f) => f.path === 'newfile.txt')).toBe(true);
101
- });
102
- it('should return error for invalid path', async () => {
103
- const message = createMessage('git:stage', { paths: ['nonexistent.txt'] });
104
- const response = await handler.handleMessage(message);
105
- expect(response.type).toBe('git:stage:response');
106
- expect(response.payload.success).toBe(false);
107
- expect(response.payload.error).toBeDefined();
108
- });
109
- });
110
- describe('handleMessage - git:unstage', () => {
111
- it('should unstage files successfully', async () => {
112
- await writeFile(join(testRepoPath, 'newfile.txt'), 'content');
113
- await simpleGit(testRepoPath).add('newfile.txt');
114
- const message = createMessage('git:unstage', { paths: ['newfile.txt'] });
115
- const response = await handler.handleMessage(message);
116
- expect(response.type).toBe('git:unstage:response');
117
- expect(response.payload.success).toBe(true);
118
- });
119
- });
120
- describe('handleMessage - git:commit', () => {
121
- it('should create commit successfully', async () => {
122
- await writeFile(join(testRepoPath, 'newfile.txt'), 'content');
123
- await simpleGit(testRepoPath).add('newfile.txt');
124
- const message = createMessage('git:commit', { message: 'Test commit' });
125
- const response = await handler.handleMessage(message);
126
- expect(response.type).toBe('git:commit:response');
127
- expect(response.payload.success).toBe(true);
128
- expect(response.payload.hash).toBeDefined();
129
- });
130
- it('should create commit with description', async () => {
131
- await writeFile(join(testRepoPath, 'newfile.txt'), 'content');
132
- await simpleGit(testRepoPath).add('newfile.txt');
133
- const message = createMessage('git:commit', {
134
- message: 'Title',
135
- description: 'Extended description',
136
- });
137
- const response = await handler.handleMessage(message);
138
- expect(response.type).toBe('git:commit:response');
139
- expect(response.payload.success).toBe(true);
140
- });
141
- it('should handle empty commit gracefully', async () => {
142
- const message = createMessage('git:commit', { message: 'Empty commit' });
143
- const response = await handler.handleMessage(message);
144
- // The behavior depends on git - it might succeed with empty commit or fail
145
- // We just verify it returns a proper response
146
- expect(response.type).toBe('git:commit:response');
147
- });
148
- });
149
- describe('handleMessage - git:log', () => {
150
- it('should return commit log', async () => {
151
- const message = createMessage('git:log', { limit: 10 });
152
- const response = await handler.handleMessage(message);
153
- expect(response.type).toBe('git:log:response');
154
- expect(response.id).toBe(message.id);
155
- const payload = response.payload;
156
- expect(Array.isArray(payload.commits)).toBe(true);
157
- expect(payload.commits.length).toBeGreaterThan(0);
158
- expect(payload.commits[0].message).toBe('Initial commit');
159
- });
160
- it('should use default limit when not specified', async () => {
161
- const message = createMessage('git:log', {});
162
- const response = await handler.handleMessage(message);
163
- expect(response.type).toBe('git:log:response');
164
- });
165
- });
166
- describe('handleMessage - git:branches', () => {
167
- it('should return branches', async () => {
168
- const message = createMessage('git:branches', {});
169
- const response = await handler.handleMessage(message);
170
- expect(response.type).toBe('git:branches:response');
171
- const payload = response.payload;
172
- expect(Array.isArray(payload.branches)).toBe(true);
173
- expect(payload.current).toBe(defaultBranch);
174
- });
175
- });
176
- describe('handleMessage - git:checkout', () => {
177
- it('should checkout existing branch', async () => {
178
- await simpleGit(testRepoPath).checkoutLocalBranch('feature');
179
- const message = createMessage('git:checkout', { branch: defaultBranch });
180
- const response = await handler.handleMessage(message);
181
- expect(response.type).toBe('git:checkout:response');
182
- expect(response.payload.success).toBe(true);
183
- });
184
- it('should create and checkout new branch', async () => {
185
- const message = createMessage('git:checkout', { branch: 'new-feature', create: true });
186
- const response = await handler.handleMessage(message);
187
- expect(response.type).toBe('git:checkout:response');
188
- expect(response.payload.success).toBe(true);
189
- // Verify branch was created
190
- const branchMsg = createMessage('git:branches', {});
191
- const branchResp = await handler.handleMessage(branchMsg);
192
- expect(branchResp.payload.current).toBe('new-feature');
193
- });
194
- it('should fail for non-existent branch', async () => {
195
- const message = createMessage('git:checkout', { branch: 'nonexistent' });
196
- const response = await handler.handleMessage(message);
197
- expect(response.type).toBe('git:checkout:response');
198
- expect(response.payload.success).toBe(false);
199
- });
200
- });
201
- describe('handleMessage - git:discard', () => {
202
- it('should discard changes', async () => {
203
- await writeFile(join(testRepoPath, 'README.md'), '# Modified\n');
204
- const message = createMessage('git:discard', { paths: ['README.md'] });
205
- const response = await handler.handleMessage(message);
206
- expect(response.type).toBe('git:discard:response');
207
- expect(response.payload.success).toBe(true);
208
- // Verify changes were discarded
209
- const statusMsg = createMessage('git:status', {});
210
- const statusResp = await handler.handleMessage(statusMsg);
211
- expect(statusResp.payload.unstaged).toHaveLength(0);
212
- });
213
- });
214
- describe('handleMessage - git:untrack', () => {
215
- it('should untrack a tracked file', async () => {
216
- const message = createMessage('git:untrack', { paths: ['README.md'] });
217
- const response = await handler.handleMessage(message);
218
- expect(response.type).toBe('git:untrack:response');
219
- expect(response.id).toBe(message.id);
220
- expect(response.payload.success).toBe(true);
221
- });
222
- });
223
- describe('handleMessage - git:gitignore-add', () => {
224
- it('should add a pattern to .gitignore', async () => {
225
- const message = createMessage('git:gitignore-add', { pattern: 'node_modules/' });
226
- const response = await handler.handleMessage(message);
227
- expect(response.type).toBe('git:gitignore-add:response');
228
- expect(response.payload.success).toBe(true);
229
- const content = await readFile(join(testRepoPath, '.gitignore'), 'utf-8');
230
- expect(content).toContain('node_modules/');
231
- });
232
- });
233
- describe('handleMessage - git:gitignore-read', () => {
234
- it('should read .gitignore content', async () => {
235
- await writeFile(join(testRepoPath, '.gitignore'), '*.log\n');
236
- const message = createMessage('git:gitignore-read', {});
237
- const response = await handler.handleMessage(message);
238
- expect(response.type).toBe('git:gitignore-read:response');
239
- expect(response.payload.content).toBe('*.log\n');
240
- expect(response.payload.exists).toBe(true);
241
- });
242
- it('should return empty when .gitignore does not exist', async () => {
243
- const message = createMessage('git:gitignore-read', {});
244
- const response = await handler.handleMessage(message);
245
- expect(response.payload.content).toBe('');
246
- expect(response.payload.exists).toBe(false);
247
- });
248
- });
249
- describe('handleMessage - git:gitignore-write', () => {
250
- it('should write .gitignore content', async () => {
251
- const message = createMessage('git:gitignore-write', { content: 'dist/\n*.log\n' });
252
- const response = await handler.handleMessage(message);
253
- expect(response.type).toBe('git:gitignore-write:response');
254
- expect(response.payload.success).toBe(true);
255
- const content = await readFile(join(testRepoPath, '.gitignore'), 'utf-8');
256
- expect(content).toBe('dist/\n*.log\n');
257
- });
258
- });
259
- describe('handleMessage - unknown type', () => {
260
- it('should return error for unknown message type', async () => {
261
- const message = createMessage('unknown:type', {});
262
- const response = await handler.handleMessage(message);
263
- expect(response.type).toBe('error');
264
- expect(response.payload.code).toBe('UNKNOWN_MESSAGE_TYPE');
265
- });
266
- });
267
- describe('handleMessage - error handling', () => {
268
- it('should preserve message ID in responses', async () => {
269
- const message = createMessage('ping', {});
270
- message.id = 'custom-id-123';
271
- const response = await handler.handleMessage(message);
272
- // pong doesn't preserve ID in current implementation
273
- // but status and other git ops should
274
- expect(response).toBeDefined();
275
- });
276
- });
277
- describe('multi-client support', () => {
278
- const clientA = 'pwa:clientA';
279
- const clientB = 'pwa:clientB';
280
- let secondRepoPath;
281
- beforeEach(async () => {
282
- // Create a second repo for multi-repo tests
283
- secondRepoPath = join(tmpdir(), `quicksave-handler-test2-${Date.now()}-${Math.random().toString(36).slice(2)}`);
284
- await mkdir(secondRepoPath, { recursive: true });
285
- const git2 = simpleGit(secondRepoPath);
286
- await git2.init();
287
- await git2.addConfig('user.email', 'test@test.com');
288
- await git2.addConfig('user.name', 'Test User');
289
- await writeFile(join(secondRepoPath, 'README.md'), '# Second Repo\n');
290
- await git2.add('README.md');
291
- await git2.commit('Initial commit');
292
- // Recreate handler with two repos
293
- handler = new MessageHandler([
294
- { path: testRepoPath, name: 'test-repo' },
295
- { path: secondRepoPath, name: 'second-repo' },
296
- ]);
297
- });
298
- afterEach(async () => {
299
- try {
300
- await rm(secondRepoPath, { recursive: true, force: true });
301
- }
302
- catch {
303
- // Ignore
304
- }
305
- });
306
- it('should isolate repo context per client', async () => {
307
- // Client A switches to second repo
308
- const switchMsg = createMessage('agent:switch-repo', { path: secondRepoPath });
309
- const switchResp = await handler.handleMessage(switchMsg, clientA);
310
- expect(switchResp.payload.success).toBe(true);
311
- // Client B should still be on default repo
312
- const listMsgB = createMessage('agent:list-repos', {});
313
- const listRespB = await handler.handleMessage(listMsgB, clientB);
314
- expect(listRespB.payload.current).toBe(testRepoPath);
315
- });
316
- it('should return per-client current repo in list-repos', async () => {
317
- // Client A switches to second repo
318
- const switchMsg = createMessage('agent:switch-repo', { path: secondRepoPath });
319
- await handler.handleMessage(switchMsg, clientA);
320
- // Client A's list-repos should show second repo as current
321
- const listMsgA = createMessage('agent:list-repos', {});
322
- const listRespA = await handler.handleMessage(listMsgA, clientA);
323
- expect(listRespA.payload.current).toBe(secondRepoPath);
324
- // Client B's list-repos should show first repo as current
325
- const listMsgB = createMessage('agent:list-repos', {});
326
- const listRespB = await handler.handleMessage(listMsgB, clientB);
327
- expect(listRespB.payload.current).toBe(testRepoPath);
328
- });
329
- it('should return per-client repo path in handshake', async () => {
330
- // Client A switches repo
331
- const switchMsg = createMessage('agent:switch-repo', { path: secondRepoPath });
332
- await handler.handleMessage(switchMsg, clientA);
333
- // Client B handshake should return default repo
334
- const handshakeMsg = createMessage('handshake', { publicKey: 'test-key' });
335
- const handshakeResp = await handler.handleMessage(handshakeMsg, clientB);
336
- expect(handshakeResp.payload.repoPath).toBe(testRepoPath);
337
- });
338
- it('should clean up client state on removeClient', async () => {
339
- // Client A switches repo
340
- const switchMsg = createMessage('agent:switch-repo', { path: secondRepoPath });
341
- await handler.handleMessage(switchMsg, clientA);
342
- // Remove client A
343
- handler.removeClient(clientA);
344
- // Client A reconnecting should get default repo again
345
- const listMsg = createMessage('agent:list-repos', {});
346
- const listResp = await handler.handleMessage(listMsg, clientA);
347
- expect(listResp.payload.current).toBe(testRepoPath);
348
- });
349
- it('should allow sequential mutating ops from different clients', async () => {
350
- await writeFile(join(testRepoPath, 'file1.txt'), 'content1');
351
- await writeFile(join(testRepoPath, 'file2.txt'), 'content2');
352
- const stageMsg1 = createMessage('git:stage', { paths: ['file1.txt'] });
353
- const resp1 = await handler.handleMessage(stageMsg1, clientA);
354
- expect(resp1.payload.success).toBe(true);
355
- const stageMsg2 = createMessage('git:stage', { paths: ['file2.txt'] });
356
- const resp2 = await handler.handleMessage(stageMsg2, clientB);
357
- expect(resp2.payload.success).toBe(true);
358
- });
359
- });
360
- });
361
- //# sourceMappingURL=messageHandler.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"messageHandler.test.js","sourceRoot":"","sources":["../../src/handlers/messageHandler.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,YAAoB,CAAC;IACzB,IAAI,OAAuB,CAAC;IAC5B,IAAI,aAAqB,CAAC;IAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,6BAA6B;QAC7B,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,sBAAsB;QACtB,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE9C,wBAAwB;QACxB,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;QAClE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAEnC,oFAAoF;QACpF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAClC,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QAEzC,OAAO,GAAG,IAAI,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAc,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAc,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;YAEjE,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAc,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErD,yBAAyB;YACzB,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAc,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE;gBAC1C,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,2EAA2E;YAC3E,8CAA8C;YAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAc,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAc,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAE7D,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErD,4BAA4B;YAC5B,MAAM,SAAS,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,CAAE,UAAU,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;YAEjE,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErD,gCAAgC;YAChC,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,CAAE,UAAU,CAAC,OAAe,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,OAAO,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC1D,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,GAAG,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACpF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC3D,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,cAAqB,EAAE,EAAE,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC;YAE7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtD,qDAAqD;YACrD,sCAAsC;YACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,OAAO,GAAG,aAAa,CAAC;QAE9B,IAAI,cAAsB,CAAC;QAE3B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,4CAA4C;YAC5C,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChH,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAEpC,kCAAkC;YAClC,OAAO,GAAG,IAAI,cAAc,CAAC;gBAC3B,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE;gBACzC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,mCAAmC;YACnC,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,CAAE,UAAU,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEvD,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,CAAE,SAAS,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,mCAAmC;YACnC,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/E,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEhD,2DAA2D;YAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,CAAE,SAAS,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAEhE,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,CAAE,SAAS,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,yBAAyB;YACzB,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/E,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEhD,gDAAgD;YAChD,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3E,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzE,MAAM,CAAE,aAAa,CAAC,OAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,yBAAyB;YACzB,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/E,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEhD,kBAAkB;YAClB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAE9B,sDAAsD;YACtD,MAAM,OAAO,GAAG,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YAE7D,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAE,KAAK,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAE,KAAK,CAAC,OAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ipc.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ipc.test.d.ts","sourceRoot":"","sources":["../../src/service/ipc.test.ts"],"names":[],"mappings":""}
@@ -1,140 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { join } from 'path';
3
- import { tmpdir } from 'os';
4
- import { mkdtempSync, rmSync } from 'fs';
5
- import { IpcServer } from './ipcServer.js';
6
- import { IpcClient } from './ipcClient.js';
7
- function makeTmpDir() {
8
- return mkdtempSync(join(tmpdir(), 'qs-ipc-test-'));
9
- }
10
- describe('IPC Server + Client', () => {
11
- let tmpDir;
12
- let server;
13
- const clients = [];
14
- afterEach(async () => {
15
- for (const c of clients)
16
- c.close();
17
- clients.length = 0;
18
- if (server)
19
- await server.close();
20
- if (tmpDir) {
21
- try {
22
- rmSync(tmpDir, { recursive: true, force: true });
23
- }
24
- catch { /* ignore */ }
25
- }
26
- });
27
- function socketPath() {
28
- tmpDir = makeTmpDir();
29
- return join(tmpDir, 'test.sock');
30
- }
31
- async function createServer() {
32
- const sock = socketPath();
33
- server = new IpcServer({ version: '0.6.1' });
34
- await server.listen(sock);
35
- return sock;
36
- }
37
- async function createClient(sock) {
38
- const client = new IpcClient();
39
- const hello = await client.connect(sock);
40
- clients.push(client);
41
- return { client, hello };
42
- }
43
- it('hello handshake returns daemon version info', async () => {
44
- const sock = await createServer();
45
- const { hello } = await createClient(sock);
46
- expect(hello.daemonVersion).toBe('0.6.1');
47
- expect(hello.daemonIpcVersion).toBe(1);
48
- expect(hello.daemonPid).toBe(process.pid);
49
- expect(typeof hello.daemonBuildId).toBe('string');
50
- });
51
- it('ping returns uptime and version', async () => {
52
- const sock = await createServer();
53
- const { client } = await createClient(sock);
54
- const result = await client.request('ping');
55
- expect(result.version).toBe('0.6.1');
56
- expect(result.ipcVersion).toBe(1);
57
- expect(typeof result.uptime).toBe('number');
58
- expect(result.uptime).toBeGreaterThanOrEqual(0);
59
- });
60
- it('status returns daemon status summary', async () => {
61
- const sock = await createServer();
62
- const { client } = await createClient(sock);
63
- const result = await client.request('status');
64
- expect(result.pid).toBe(process.pid);
65
- expect(result.version).toBe('0.6.1');
66
- expect(typeof result.uptime).toBe('number');
67
- expect(result.connectionState).toBe('disconnected');
68
- expect(result.peerCount).toBe(0);
69
- });
70
- it('unknown method returns error', async () => {
71
- const sock = await createServer();
72
- const { client } = await createClient(sock);
73
- await expect(client.request('nonexistent')).rejects.toThrow('Method not found');
74
- });
75
- it('custom method handler works', async () => {
76
- const sock = await createServer();
77
- server.registerMethod('echo', (params) => ({ echoed: params }));
78
- const { client } = await createClient(sock);
79
- const result = await client.request('echo', { message: 'hello' });
80
- expect(result.echoed).toEqual({ message: 'hello' });
81
- });
82
- it('multiple clients can connect', async () => {
83
- const sock = await createServer();
84
- const { client: c1 } = await createClient(sock);
85
- const { client: c2 } = await createClient(sock);
86
- const r1 = await c1.request('ping');
87
- const r2 = await c2.request('ping');
88
- expect(r1.version).toBe('0.6.1');
89
- expect(r2.version).toBe('0.6.1');
90
- expect(server.getClientCount()).toBe(2);
91
- });
92
- it('subscribe-events enables notifications', async () => {
93
- const sock = await createServer();
94
- const { client } = await createClient(sock);
95
- const received = [];
96
- client.onNotification((method, params) => {
97
- received.push({ method, params });
98
- });
99
- await client.request('subscribe-events');
100
- // Broadcast a notification
101
- server.broadcast({
102
- jsonrpc: '2.0',
103
- method: 'event.test',
104
- params: { foo: 'bar' },
105
- });
106
- // Give the event a moment to arrive
107
- await new Promise((r) => setTimeout(r, 50));
108
- expect(received.length).toBe(1);
109
- expect(received[0].method).toBe('event.test');
110
- expect(received[0].params).toEqual({ foo: 'bar' });
111
- });
112
- it('shutdown request triggers shutdown event', async () => {
113
- const sock = await createServer();
114
- const { client } = await createClient(sock);
115
- let shutdownRequested = false;
116
- server.on('shutdown-requested', () => {
117
- shutdownRequested = true;
118
- });
119
- const result = await client.request('shutdown');
120
- expect(result.ok).toBe(true);
121
- // Wait for nextTick
122
- await new Promise((r) => setTimeout(r, 10));
123
- expect(shutdownRequested).toBe(true);
124
- });
125
- it('client disconnect is detected by server', async () => {
126
- const sock = await createServer();
127
- const { client } = await createClient(sock);
128
- expect(server.getClientCount()).toBe(1);
129
- let disconnected = false;
130
- server.on('client-disconnected', () => {
131
- disconnected = true;
132
- });
133
- client.close();
134
- // Wait for the close event to propagate
135
- await new Promise((r) => setTimeout(r, 50));
136
- expect(server.getClientCount()).toBe(0);
137
- expect(disconnected).toBe(true);
138
- });
139
- });
140
- //# sourceMappingURL=ipc.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ipc.test.js","sourceRoot":"","sources":["../../src/service/ipc.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=singleton.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleton.test.d.ts","sourceRoot":"","sources":["../../src/service/singleton.test.ts"],"names":[],"mappings":""}
@@ -1,39 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { isProcessAlive } from './singleton.js';
3
- import { shouldRestartDaemon, IPC_VERSION, BUILD_ID } from './types.js';
4
- describe('isProcessAlive', () => {
5
- it('returns true for the current process', () => {
6
- expect(isProcessAlive(process.pid)).toBe(true);
7
- });
8
- it('returns false for a non-existent PID', () => {
9
- // PID 99999999 is extremely unlikely to exist
10
- expect(isProcessAlive(99999999)).toBe(false);
11
- });
12
- });
13
- describe('shouldRestartDaemon', () => {
14
- const makeDaemon = (overrides = {}) => ({
15
- daemonVersion: '0.6.1',
16
- daemonIpcVersion: IPC_VERSION,
17
- daemonBuildId: BUILD_ID,
18
- daemonPid: 12345,
19
- ...overrides,
20
- });
21
- it('returns ok when versions match', () => {
22
- const result = shouldRestartDaemon(makeDaemon(), { ipcVersion: IPC_VERSION, buildId: BUILD_ID });
23
- expect(result.action).toBe('ok');
24
- });
25
- it('returns restart when daemon ipcVersion is lower', () => {
26
- const result = shouldRestartDaemon(makeDaemon({ daemonIpcVersion: 0 }), { ipcVersion: IPC_VERSION, buildId: BUILD_ID });
27
- expect(result.action).toBe('restart');
28
- });
29
- it('returns warn_outdated when CLI ipcVersion is lower', () => {
30
- const result = shouldRestartDaemon(makeDaemon({ daemonIpcVersion: 99 }), { ipcVersion: IPC_VERSION, buildId: BUILD_ID });
31
- expect(result.action).toBe('warn_outdated');
32
- });
33
- it('returns restart when buildId differs in dev mode', () => {
34
- // In dev mode, BUILD_ID starts with 'dev-' so isDev() returns true
35
- const result = shouldRestartDaemon(makeDaemon({ daemonBuildId: 'dev-aaa111bbb222' }), { ipcVersion: IPC_VERSION, buildId: 'dev-ccc333ddd444' });
36
- expect(result.action).toBe('restart');
37
- });
38
- });
39
- //# sourceMappingURL=singleton.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleton.test.js","sourceRoot":"","sources":["../../src/service/singleton.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGxE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,8CAA8C;QAC9C,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,UAAU,GAAG,CAAC,YAAkC,EAAE,EAAe,EAAE,CAAC,CAAC;QACzE,aAAa,EAAE,OAAO;QACtB,gBAAgB,EAAE,WAAW;QAC7B,aAAa,EAAE,QAAQ;QACvB,SAAS,EAAE,KAAK;QAChB,GAAG,SAAS;KACb,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,mBAAmB,CAChC,UAAU,EAAE,EACZ,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAC/C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,mBAAmB,CAChC,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EACnC,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAC/C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,mBAAmB,CAChC,UAAU,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,EACpC,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAC/C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,mEAAmE;QACnE,MAAM,MAAM,GAAG,mBAAmB,CAChC,UAAU,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,EACjD,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACzD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}