@doist/twist-cli 2.4.0 → 2.5.1

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 (98) hide show
  1. package/dist/commands/conversation.d.ts.map +1 -1
  2. package/dist/commands/conversation.js +4 -3
  3. package/dist/commands/conversation.js.map +1 -1
  4. package/dist/commands/inbox.js +2 -2
  5. package/dist/commands/inbox.js.map +1 -1
  6. package/dist/commands/thread.d.ts.map +1 -1
  7. package/dist/commands/thread.js +3 -2
  8. package/dist/commands/thread.js.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/output.d.ts +1 -0
  12. package/dist/lib/output.d.ts.map +1 -1
  13. package/dist/lib/output.js +3 -0
  14. package/dist/lib/output.js.map +1 -1
  15. package/dist/lib/skills/content.d.ts +2 -2
  16. package/dist/lib/skills/content.d.ts.map +1 -1
  17. package/dist/lib/skills/content.js +1 -0
  18. package/dist/lib/skills/content.js.map +1 -1
  19. package/dist/lib/skills/index.d.ts.map +1 -1
  20. package/dist/lib/skills/index.js +5 -0
  21. package/dist/lib/skills/index.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/__tests__/auth.test.d.ts +0 -2
  24. package/dist/__tests__/auth.test.d.ts.map +0 -1
  25. package/dist/__tests__/auth.test.js +0 -340
  26. package/dist/__tests__/auth.test.js.map +0 -1
  27. package/dist/__tests__/channel.test.d.ts +0 -2
  28. package/dist/__tests__/channel.test.d.ts.map +0 -1
  29. package/dist/__tests__/channel.test.js +0 -30
  30. package/dist/__tests__/channel.test.js.map +0 -1
  31. package/dist/__tests__/completion.test.d.ts +0 -2
  32. package/dist/__tests__/completion.test.d.ts.map +0 -1
  33. package/dist/__tests__/completion.test.js +0 -106
  34. package/dist/__tests__/completion.test.js.map +0 -1
  35. package/dist/__tests__/conversation.test.d.ts +0 -2
  36. package/dist/__tests__/conversation.test.d.ts.map +0 -1
  37. package/dist/__tests__/conversation.test.js +0 -47
  38. package/dist/__tests__/conversation.test.js.map +0 -1
  39. package/dist/__tests__/inbox.test.d.ts +0 -2
  40. package/dist/__tests__/inbox.test.d.ts.map +0 -1
  41. package/dist/__tests__/inbox.test.js +0 -31
  42. package/dist/__tests__/inbox.test.js.map +0 -1
  43. package/dist/__tests__/lib/dates.test.d.ts +0 -2
  44. package/dist/__tests__/lib/dates.test.d.ts.map +0 -1
  45. package/dist/__tests__/lib/dates.test.js +0 -58
  46. package/dist/__tests__/lib/dates.test.js.map +0 -1
  47. package/dist/__tests__/lib/public-channels.test.d.ts +0 -2
  48. package/dist/__tests__/lib/public-channels.test.d.ts.map +0 -1
  49. package/dist/__tests__/lib/public-channels.test.js +0 -124
  50. package/dist/__tests__/lib/public-channels.test.js.map +0 -1
  51. package/dist/__tests__/lib/refs.test.d.ts +0 -2
  52. package/dist/__tests__/lib/refs.test.d.ts.map +0 -1
  53. package/dist/__tests__/lib/refs.test.js +0 -191
  54. package/dist/__tests__/lib/refs.test.js.map +0 -1
  55. package/dist/__tests__/msg.test.d.ts +0 -2
  56. package/dist/__tests__/msg.test.d.ts.map +0 -1
  57. package/dist/__tests__/msg.test.js +0 -31
  58. package/dist/__tests__/msg.test.js.map +0 -1
  59. package/dist/__tests__/postinstall.test.d.ts +0 -2
  60. package/dist/__tests__/postinstall.test.d.ts.map +0 -1
  61. package/dist/__tests__/postinstall.test.js +0 -20
  62. package/dist/__tests__/postinstall.test.js.map +0 -1
  63. package/dist/__tests__/progress.test.d.ts +0 -2
  64. package/dist/__tests__/progress.test.d.ts.map +0 -1
  65. package/dist/__tests__/progress.test.js +0 -258
  66. package/dist/__tests__/progress.test.js.map +0 -1
  67. package/dist/__tests__/react.test.d.ts +0 -2
  68. package/dist/__tests__/react.test.d.ts.map +0 -1
  69. package/dist/__tests__/react.test.js +0 -59
  70. package/dist/__tests__/react.test.js.map +0 -1
  71. package/dist/__tests__/search.test.d.ts +0 -2
  72. package/dist/__tests__/search.test.d.ts.map +0 -1
  73. package/dist/__tests__/search.test.js +0 -77
  74. package/dist/__tests__/search.test.js.map +0 -1
  75. package/dist/__tests__/skill.test.d.ts +0 -2
  76. package/dist/__tests__/skill.test.d.ts.map +0 -1
  77. package/dist/__tests__/skill.test.js +0 -271
  78. package/dist/__tests__/skill.test.js.map +0 -1
  79. package/dist/__tests__/spinner.test.d.ts +0 -2
  80. package/dist/__tests__/spinner.test.d.ts.map +0 -1
  81. package/dist/__tests__/spinner.test.js +0 -252
  82. package/dist/__tests__/spinner.test.js.map +0 -1
  83. package/dist/__tests__/thread.test.d.ts +0 -2
  84. package/dist/__tests__/thread.test.d.ts.map +0 -1
  85. package/dist/__tests__/thread.test.js +0 -54
  86. package/dist/__tests__/thread.test.js.map +0 -1
  87. package/dist/__tests__/update.test.d.ts +0 -2
  88. package/dist/__tests__/update.test.d.ts.map +0 -1
  89. package/dist/__tests__/update.test.js +0 -166
  90. package/dist/__tests__/update.test.js.map +0 -1
  91. package/dist/__tests__/user.test.d.ts +0 -2
  92. package/dist/__tests__/user.test.d.ts.map +0 -1
  93. package/dist/__tests__/user.test.js +0 -28
  94. package/dist/__tests__/user.test.js.map +0 -1
  95. package/dist/__tests__/view.test.d.ts +0 -2
  96. package/dist/__tests__/view.test.d.ts.map +0 -1
  97. package/dist/__tests__/view.test.js +0 -68
  98. package/dist/__tests__/view.test.js.map +0 -1
@@ -1,340 +0,0 @@
1
- import { Command } from 'commander';
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
- // Mock the auth module
4
- vi.mock('../lib/auth.js', () => ({
5
- saveApiToken: vi.fn(),
6
- clearApiToken: vi.fn(),
7
- }));
8
- // Mock the api module
9
- vi.mock('../lib/api.js', () => ({
10
- getSessionUser: vi.fn(),
11
- }));
12
- // Mock the config module
13
- vi.mock('../lib/config.js', () => ({
14
- getConfigPath: vi.fn(() => '/home/user/.config/twist-cli/config.json'),
15
- }));
16
- // Mock OAuth modules
17
- vi.mock('../lib/oauth.js', () => ({
18
- buildAuthorizationUrl: vi.fn(),
19
- exchangeCodeForToken: vi.fn(),
20
- registerDynamicClient: vi.fn(),
21
- }));
22
- vi.mock('../lib/oauth-server.js', () => ({
23
- startCallbackServer: vi.fn(),
24
- }));
25
- vi.mock('../lib/pkce.js', () => ({
26
- generateCodeVerifier: vi.fn(),
27
- generateCodeChallenge: vi.fn(),
28
- generateState: vi.fn(),
29
- }));
30
- // Mock open package
31
- vi.mock('open', () => ({
32
- default: vi.fn(),
33
- }));
34
- // Mock readline for interactive token input
35
- vi.mock('node:readline', () => ({
36
- createInterface: vi.fn(() => {
37
- const rl = {
38
- question: vi.fn(),
39
- close: vi.fn(),
40
- };
41
- return rl;
42
- }),
43
- }));
44
- // Mock chalk to avoid colors in tests
45
- vi.mock('chalk');
46
- import { createInterface } from 'node:readline';
47
- import open from 'open';
48
- import { registerAuthCommand } from '../commands/auth.js';
49
- import { getSessionUser } from '../lib/api.js';
50
- import { clearApiToken, saveApiToken } from '../lib/auth.js';
51
- import { buildAuthorizationUrl, exchangeCodeForToken, registerDynamicClient } from '../lib/oauth.js';
52
- import { startCallbackServer } from '../lib/oauth-server.js';
53
- import { generateCodeChallenge, generateCodeVerifier, generateState } from '../lib/pkce.js';
54
- const mockCreateInterface = vi.mocked(createInterface);
55
- const mockSaveApiToken = vi.mocked(saveApiToken);
56
- const mockClearApiToken = vi.mocked(clearApiToken);
57
- const mockGetSessionUser = vi.mocked(getSessionUser);
58
- // OAuth mocks
59
- const mockGenerateCodeVerifier = vi.mocked(generateCodeVerifier);
60
- const mockGenerateCodeChallenge = vi.mocked(generateCodeChallenge);
61
- const mockGenerateState = vi.mocked(generateState);
62
- const mockBuildAuthorizationUrl = vi.mocked(buildAuthorizationUrl);
63
- const mockStartCallbackServer = vi.mocked(startCallbackServer);
64
- const mockExchangeCodeForToken = vi.mocked(exchangeCodeForToken);
65
- const mockRegisterDynamicClient = vi.mocked(registerDynamicClient);
66
- const mockOpen = vi.mocked(open);
67
- function createProgram() {
68
- const program = new Command();
69
- program.exitOverride();
70
- registerAuthCommand(program);
71
- return program;
72
- }
73
- describe('auth command', () => {
74
- let consoleSpy;
75
- beforeEach(() => {
76
- vi.clearAllMocks();
77
- // Mock console.log to capture output
78
- consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
79
- });
80
- afterEach(() => {
81
- consoleSpy.mockRestore();
82
- });
83
- describe('token subcommand', () => {
84
- it('successfully saves a token', async () => {
85
- const program = createProgram();
86
- const token = 'some_token_123456789';
87
- // Mock successful token save
88
- mockSaveApiToken.mockResolvedValue(undefined);
89
- await program.parseAsync(['node', 'tw', 'auth', 'token', token]);
90
- // Verify token was saved
91
- expect(mockSaveApiToken).toHaveBeenCalledWith(token);
92
- // Verify success message
93
- expect(consoleSpy).toHaveBeenCalledWith('✓', 'API token saved successfully!');
94
- expect(consoleSpy).toHaveBeenCalledWith('Token saved to /home/user/.config/twist-cli/config.json');
95
- });
96
- it('handles saveApiToken errors', async () => {
97
- const program = createProgram();
98
- const token = 'some_token_123456789';
99
- // Mock save failure
100
- mockSaveApiToken.mockRejectedValue(new Error('Permission denied'));
101
- await expect(program.parseAsync(['node', 'tw', 'auth', 'token', token])).rejects.toThrow('Permission denied');
102
- expect(mockSaveApiToken).toHaveBeenCalledWith(token);
103
- });
104
- it('trims whitespace from token', async () => {
105
- const program = createProgram();
106
- const tokenWithWhitespace = ' some_token_123456789 ';
107
- const expectedToken = 'some_token_123456789';
108
- mockSaveApiToken.mockResolvedValue(undefined);
109
- await program.parseAsync(['node', 'tw', 'auth', 'token', tokenWithWhitespace]);
110
- expect(mockSaveApiToken).toHaveBeenCalledWith(expectedToken);
111
- });
112
- it('prompts interactively when no token argument given', async () => {
113
- const program = createProgram();
114
- const mockRl = {
115
- question: vi.fn((_prompt, cb) => {
116
- cb('interactive_token_456');
117
- }),
118
- close: vi.fn(),
119
- _writeToOutput: vi.fn(),
120
- };
121
- mockCreateInterface.mockReturnValue(mockRl);
122
- mockSaveApiToken.mockResolvedValue(undefined);
123
- const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
124
- await program.parseAsync(['node', 'tw', 'auth', 'token']);
125
- expect(mockRl.question).toHaveBeenCalled();
126
- expect(mockRl.close).toHaveBeenCalled();
127
- expect(mockSaveApiToken).toHaveBeenCalledWith('interactive_token_456');
128
- writeSpy.mockRestore();
129
- });
130
- it('shows error when interactive input is empty', async () => {
131
- const program = createProgram();
132
- const mockRl = {
133
- question: vi.fn((_prompt, cb) => {
134
- cb('');
135
- }),
136
- close: vi.fn(),
137
- _writeToOutput: vi.fn(),
138
- };
139
- mockCreateInterface.mockReturnValue(mockRl);
140
- const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
141
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
142
- await program.parseAsync(['node', 'tw', 'auth', 'token']);
143
- expect(mockSaveApiToken).not.toHaveBeenCalled();
144
- expect(errorSpy).toHaveBeenCalledWith('Error:', 'No token provided');
145
- writeSpy.mockRestore();
146
- errorSpy.mockRestore();
147
- });
148
- });
149
- describe('status subcommand', () => {
150
- it('shows authenticated status when logged in', async () => {
151
- const program = createProgram();
152
- const mockUser = {
153
- id: 1,
154
- name: 'Test User',
155
- shortName: 'test',
156
- bot: false,
157
- timezone: 'UTC',
158
- removed: false,
159
- email: 'test@example.com',
160
- lang: 'en',
161
- };
162
- mockGetSessionUser.mockResolvedValue(mockUser);
163
- await program.parseAsync(['node', 'tw', 'auth', 'status']);
164
- expect(mockGetSessionUser).toHaveBeenCalled();
165
- expect(consoleSpy).toHaveBeenCalledWith('✓', 'Authenticated');
166
- expect(consoleSpy).toHaveBeenCalledWith(' Email: test@example.com');
167
- expect(consoleSpy).toHaveBeenCalledWith(' Name: Test User');
168
- });
169
- it('shows not authenticated when no token', async () => {
170
- const program = createProgram();
171
- mockGetSessionUser.mockRejectedValue(new Error('No API token found'));
172
- await program.parseAsync(['node', 'tw', 'auth', 'status']);
173
- expect(consoleSpy).toHaveBeenCalledWith('Not authenticated');
174
- expect(consoleSpy).toHaveBeenCalledWith('Run `tw auth login` for OAuth or `tw auth token <token>` for manual authentication');
175
- });
176
- });
177
- describe('login subcommand', () => {
178
- it('successfully completes OAuth flow with dynamic client registration', async () => {
179
- const program = createProgram();
180
- // Mock dynamic client registration
181
- mockRegisterDynamicClient.mockResolvedValue({
182
- client_id: 'twd_dynamic_client_id',
183
- client_secret: 'dynamic_client_secret',
184
- });
185
- // Mock PKCE parameters
186
- mockGenerateCodeVerifier.mockReturnValue('test_code_verifier');
187
- mockGenerateCodeChallenge.mockReturnValue('test_code_challenge');
188
- mockGenerateState.mockReturnValue('test_state');
189
- // Mock authorization URL
190
- mockBuildAuthorizationUrl.mockReturnValue('https://twist.com/oauth/authorize?...');
191
- // Mock callback server that resolves immediately
192
- const mockCleanup = vi.fn();
193
- mockStartCallbackServer.mockImplementation(async (expectedState) => {
194
- // Simulate the browser opening behavior by calling our mocks
195
- mockBuildAuthorizationUrl('twd_dynamic_client_id', 'test_code_challenge', expectedState);
196
- await mockOpen('https://twist.com/oauth/authorize?...');
197
- return Promise.resolve({
198
- code: 'auth_code_123',
199
- cleanup: mockCleanup,
200
- });
201
- });
202
- // Mock token exchange
203
- mockExchangeCodeForToken.mockResolvedValue('access_token_123');
204
- // Mock browser opening
205
- mockOpen.mockResolvedValue({});
206
- // Mock token saving
207
- mockSaveApiToken.mockResolvedValue(undefined);
208
- await program.parseAsync(['node', 'tw', 'auth', 'login']);
209
- // Verify dynamic client registration
210
- expect(mockRegisterDynamicClient).toHaveBeenCalled();
211
- // Verify PKCE parameters were generated
212
- expect(mockGenerateCodeVerifier).toHaveBeenCalled();
213
- expect(mockGenerateCodeChallenge).toHaveBeenCalledWith('test_code_verifier');
214
- expect(mockGenerateState).toHaveBeenCalled();
215
- // Verify authorization URL was built with dynamic client ID
216
- expect(mockBuildAuthorizationUrl).toHaveBeenCalledWith('twd_dynamic_client_id', 'test_code_challenge', 'test_state');
217
- // Verify callback server was started
218
- expect(mockStartCallbackServer).toHaveBeenCalledWith('test_state');
219
- // Verify browser was opened
220
- expect(mockOpen).toHaveBeenCalledWith('https://twist.com/oauth/authorize?...');
221
- // Verify token exchange with client credentials
222
- expect(mockExchangeCodeForToken).toHaveBeenCalledWith('auth_code_123', 'test_code_verifier', {
223
- client_id: 'twd_dynamic_client_id',
224
- client_secret: 'dynamic_client_secret',
225
- });
226
- // Verify token was saved
227
- expect(mockSaveApiToken).toHaveBeenCalledWith('access_token_123');
228
- // Verify cleanup was called
229
- expect(mockCleanup).toHaveBeenCalled();
230
- // Verify success messages
231
- expect(consoleSpy).toHaveBeenCalledWith('Starting OAuth authentication...');
232
- expect(consoleSpy).toHaveBeenCalledWith('✓', 'OAuth authentication successful!');
233
- });
234
- it('handles callback server errors', async () => {
235
- const program = createProgram();
236
- // Mock dynamic client registration
237
- mockRegisterDynamicClient.mockResolvedValue({
238
- client_id: 'twd_dynamic_client_id',
239
- client_secret: 'dynamic_client_secret',
240
- });
241
- // Mock PKCE parameters
242
- mockGenerateCodeVerifier.mockReturnValue('test_code_verifier');
243
- mockGenerateCodeChallenge.mockReturnValue('test_code_challenge');
244
- mockGenerateState.mockReturnValue('test_state');
245
- // Mock callback server error
246
- mockStartCallbackServer.mockRejectedValue(new Error('Port 8766 is already in use'));
247
- await program.parseAsync(['node', 'tw', 'auth', 'login']);
248
- expect(consoleSpy).toHaveBeenCalledWith('✗', 'OAuth authentication failed');
249
- expect(consoleSpy).toHaveBeenCalledWith('Port 8766 is already in use');
250
- });
251
- it('handles token exchange errors', async () => {
252
- const program = createProgram();
253
- // Mock dynamic client registration
254
- mockRegisterDynamicClient.mockResolvedValue({
255
- client_id: 'twd_dynamic_client_id',
256
- client_secret: 'dynamic_client_secret',
257
- });
258
- // Mock PKCE parameters
259
- mockGenerateCodeVerifier.mockReturnValue('test_code_verifier');
260
- mockGenerateCodeChallenge.mockReturnValue('test_code_challenge');
261
- mockGenerateState.mockReturnValue('test_state');
262
- // Mock successful callback
263
- const mockCleanup = vi.fn();
264
- mockStartCallbackServer.mockResolvedValue({
265
- code: 'auth_code_123',
266
- cleanup: mockCleanup,
267
- });
268
- // Mock token exchange error
269
- mockExchangeCodeForToken.mockRejectedValue(new Error('Invalid authorization code'));
270
- await program.parseAsync(['node', 'tw', 'auth', 'login']);
271
- expect(mockCleanup).toHaveBeenCalled();
272
- expect(consoleSpy).toHaveBeenCalledWith('✗', 'OAuth authentication failed');
273
- expect(consoleSpy).toHaveBeenCalledWith('Invalid authorization code');
274
- });
275
- it('handles browser opening errors gracefully', async () => {
276
- const program = createProgram();
277
- // Mock dynamic client registration
278
- mockRegisterDynamicClient.mockResolvedValue({
279
- client_id: 'twd_dynamic_client_id',
280
- client_secret: 'dynamic_client_secret',
281
- });
282
- // Mock PKCE parameters
283
- mockGenerateCodeVerifier.mockReturnValue('test_code_verifier');
284
- mockGenerateCodeChallenge.mockReturnValue('test_code_challenge');
285
- mockGenerateState.mockReturnValue('test_state');
286
- // Mock callback server
287
- const mockCleanup = vi.fn();
288
- mockStartCallbackServer.mockResolvedValue({
289
- code: 'auth_code_123',
290
- cleanup: mockCleanup,
291
- });
292
- // Mock browser opening error
293
- mockOpen.mockRejectedValue(new Error('No browser available'));
294
- // Mock successful token exchange (flow should still continue)
295
- mockExchangeCodeForToken.mockResolvedValue('access_token_123');
296
- mockSaveApiToken.mockResolvedValue(undefined);
297
- await program.parseAsync(['node', 'tw', 'auth', 'login']);
298
- // Should still complete successfully despite browser error
299
- expect(consoleSpy).toHaveBeenCalledWith('✓', 'OAuth authentication successful!');
300
- });
301
- it('calls cleanup when OAuth server throws', async () => {
302
- const program = createProgram();
303
- // Mock dynamic client registration
304
- mockRegisterDynamicClient.mockResolvedValue({
305
- client_id: 'twd_dynamic_client_id',
306
- client_secret: 'dynamic_client_secret',
307
- });
308
- // Mock PKCE parameters
309
- mockGenerateCodeVerifier.mockReturnValue('test_code_verifier');
310
- mockGenerateCodeChallenge.mockReturnValue('test_code_challenge');
311
- mockGenerateState.mockReturnValue('test_state');
312
- // Mock server that throws an error
313
- mockStartCallbackServer.mockRejectedValue(new Error('Server failed to start'));
314
- await program.parseAsync(['node', 'tw', 'auth', 'login']);
315
- // Should handle the error gracefully
316
- expect(consoleSpy).toHaveBeenCalledWith('✗', 'OAuth authentication failed');
317
- expect(consoleSpy).toHaveBeenCalledWith('Server failed to start');
318
- });
319
- });
320
- describe('login subcommand with unconfigured client ID', () => {
321
- // Note: Testing the unconfigured client ID scenario is complex with the current mock setup
322
- // In practice, users would need to configure their client ID before OAuth works
323
- it('would show error when client ID is not configured', () => {
324
- // This test documents the expected behavior when TWIST_CLIENT_ID === 'YOUR_CLIENT_ID'
325
- // The actual implementation checks this condition and shows an error message
326
- expect(true).toBe(true); // Placeholder for documentation purposes
327
- });
328
- });
329
- describe('logout subcommand', () => {
330
- it('clears the API token', async () => {
331
- const program = createProgram();
332
- mockClearApiToken.mockResolvedValue(undefined);
333
- await program.parseAsync(['node', 'tw', 'auth', 'logout']);
334
- expect(mockClearApiToken).toHaveBeenCalled();
335
- expect(consoleSpy).toHaveBeenCalledWith('✓', 'Logged out');
336
- expect(consoleSpy).toHaveBeenCalledWith('Token removed from /home/user/.config/twist-cli/config.json');
337
- });
338
- });
339
- });
340
- //# sourceMappingURL=auth.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAExE,uBAAuB;AACvB,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAA;AAEH,sBAAsB;AACtB,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAA;AAEH,yBAAyB;AACzB,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,0CAA0C,CAAC;CACzE,CAAC,CAAC,CAAA;AAEH,qBAAqB;AACrB,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC9B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC7B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC7B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC9B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAA;AAEH,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAA;AAEH,4CAA4C;AAC5C,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;QACxB,MAAM,EAAE,GAAG;YACP,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;YACjB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACjB,CAAA;QACD,OAAO,EAAE,CAAA;IACb,CAAC,CAAC;CACL,CAAC,CAAC,CAAA;AAEH,sCAAsC;AACtC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAEhB,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAA;AAE/D,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE3F,MAAM,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;AAEtD,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;AAChD,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;AAClD,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AAEpD,cAAc;AACd,MAAM,wBAAwB,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAChE,MAAM,yBAAyB,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAClE,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;AAClD,MAAM,yBAAyB,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAClE,MAAM,uBAAuB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAC9D,MAAM,wBAAwB,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAChE,MAAM,yBAAyB,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAClE,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAEhC,SAAS,aAAa;IAClB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO,CAAC,YAAY,EAAE,CAAA;IACtB,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,IAAI,UAAuC,CAAA;IAE3C,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAA;QAElB,qCAAqC;QACrC,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,KAAK,GAAG,sBAAsB,CAAA;YAEpC,6BAA6B;YAC7B,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAE7C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;YAEhE,yBAAyB;YACzB,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;YAEpD,yBAAyB;YACzB,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAA;YAC7E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACnC,yDAAyD,CAC5D,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,KAAK,GAAG,sBAAsB,CAAA;YAEpC,oBAAoB;YACpB,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAA;YAElE,MAAM,MAAM,CACR,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAC7D,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;YAEtC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,mBAAmB,GAAG,0BAA0B,CAAA;YACtD,MAAM,aAAa,GAAG,sBAAsB,CAAA;YAE5C,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAE7C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAA;YAE9E,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,MAAM,GAAG;gBACX,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAe,EAAE,EAA4B,EAAE,EAAE;oBAC9D,EAAE,CAAC,uBAAuB,CAAC,CAAA;gBAC/B,CAAC,CAAC;gBACF,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;gBACd,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;aAC1B,CAAA;YACD,mBAAmB,CAAC,eAAe,CAAC,MAA8B,CAAC,CAAA;YACnE,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAEjF,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;YACvC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAA;YACtE,QAAQ,CAAC,WAAW,EAAE,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,MAAM,GAAG;gBACX,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAe,EAAE,EAA4B,EAAE,EAAE;oBAC9D,EAAE,CAAC,EAAE,CAAC,CAAA;gBACV,CAAC,CAAC;gBACF,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;gBACd,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;aAC1B,CAAA;YACD,mBAAmB,CAAC,eAAe,CAAC,MAA8B,CAAC,CAAA;YACnE,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YACjF,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAExE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;YACpE,QAAQ,CAAC,WAAW,EAAE,CAAA;YACtB,QAAQ,CAAC,WAAW,EAAE,CAAA;QAC1B,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,MAAM,QAAQ,GAAS;gBACnB,EAAE,EAAE,CAAC;gBACL,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,MAAM;gBACjB,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,IAAI;aACb,CAAA;YAED,kBAAkB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE9C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;YAE1D,MAAM,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;YAC7D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAA;YACpE,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAA;YAErE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;YAE1D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAA;YAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACnC,oFAAoF,CACvF,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,mCAAmC;YACnC,yBAAyB,CAAC,iBAAiB,CAAC;gBACxC,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CAAC,CAAA;YAEF,uBAAuB;YACvB,wBAAwB,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;YAC9D,yBAAyB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAA;YAChE,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAE/C,yBAAyB;YACzB,yBAAyB,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAA;YAElF,iDAAiD;YACjD,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC3B,uBAAuB,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBAC/D,6DAA6D;gBAC7D,yBAAyB,CACrB,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,CAChB,CAAA;gBACD,MAAM,QAAQ,CAAC,uCAAuC,CAAC,CAAA;gBAEvD,OAAO,OAAO,CAAC,OAAO,CAAC;oBACnB,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,WAAW;iBACvB,CAAC,CAAA;YACN,CAAC,CAAC,CAAA;YAEF,sBAAsB;YACtB,wBAAwB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAA;YAE9D,uBAAuB;YACvB,QAAQ,CAAC,iBAAiB,CAAC,EAAsC,CAAC,CAAA;YAElE,oBAAoB;YACpB,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAE7C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,qCAAqC;YACrC,MAAM,CAAC,yBAAyB,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAEpD,wCAAwC;YACxC,MAAM,CAAC,wBAAwB,CAAC,CAAC,gBAAgB,EAAE,CAAA;YACnD,MAAM,CAAC,yBAAyB,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAA;YAC5E,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAE5C,4DAA4D;YAC5D,MAAM,CAAC,yBAAyB,CAAC,CAAC,oBAAoB,CAClD,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,CACf,CAAA;YAED,qCAAqC;YACrC,MAAM,CAAC,uBAAuB,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;YAElE,4BAA4B;YAC5B,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,uCAAuC,CAAC,CAAA;YAE9E,gDAAgD;YAChD,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CACjD,eAAe,EACf,oBAAoB,EACpB;gBACI,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CACJ,CAAA;YAED,yBAAyB;YACzB,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAA;YAEjE,4BAA4B;YAC5B,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAEtC,0BAA0B;YAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,kCAAkC,CAAC,CAAA;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAA;QACpF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,mCAAmC;YACnC,yBAAyB,CAAC,iBAAiB,CAAC;gBACxC,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CAAC,CAAA;YAEF,uBAAuB;YACvB,wBAAwB,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;YAC9D,yBAAyB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAA;YAChE,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAE/C,6BAA6B;YAC7B,uBAAuB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAA;YAEnF,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAA;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,mCAAmC;YACnC,yBAAyB,CAAC,iBAAiB,CAAC;gBACxC,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CAAC,CAAA;YAEF,uBAAuB;YACvB,wBAAwB,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;YAC9D,yBAAyB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAA;YAChE,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAE/C,2BAA2B;YAC3B,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC3B,uBAAuB,CAAC,iBAAiB,CAAC;gBACtC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,WAAW;aACvB,CAAC,CAAA;YAEF,4BAA4B;YAC5B,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;YAEnF,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAA;YACtC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAA;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,mCAAmC;YACnC,yBAAyB,CAAC,iBAAiB,CAAC;gBACxC,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CAAC,CAAA;YAEF,uBAAuB;YACvB,wBAAwB,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;YAC9D,yBAAyB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAA;YAChE,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAE/C,uBAAuB;YACvB,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC3B,uBAAuB,CAAC,iBAAiB,CAAC;gBACtC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,WAAW;aACvB,CAAC,CAAA;YAEF,6BAA6B;YAC7B,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAA;YAE7D,8DAA8D;YAC9D,wBAAwB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAA;YAC9D,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAE7C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,2DAA2D;YAC3D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAA;QACpF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAE/B,mCAAmC;YACnC,yBAAyB,CAAC,iBAAiB,CAAC;gBACxC,SAAS,EAAE,uBAAuB;gBAClC,aAAa,EAAE,uBAAuB;aACzC,CAAC,CAAA;YAEF,uBAAuB;YACvB,wBAAwB,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;YAC9D,yBAAyB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAA;YAChE,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAE/C,mCAAmC;YACnC,uBAAuB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAA;YAE9E,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAEzD,qCAAqC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAA;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;QAC1D,2FAA2F;QAC3F,gFAAgF;QAChF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YACzD,sFAAsF;YACtF,6EAA6E;YAC7E,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,yCAAyC;QACrE,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAE9C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;YAE1D,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;YAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACnC,6DAA6D,CAChE,CAAA;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=channel.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/channel.test.ts"],"names":[],"mappings":""}
@@ -1,30 +0,0 @@
1
- import { Command } from 'commander';
2
- import { beforeEach, describe, expect, it, vi } from 'vitest';
3
- vi.mock('../lib/api.js', () => ({
4
- getTwistClient: vi.fn(),
5
- getCurrentWorkspaceId: vi.fn().mockResolvedValue(1),
6
- }));
7
- vi.mock('../lib/refs.js', () => ({
8
- resolveWorkspaceRef: vi.fn(),
9
- }));
10
- vi.mock('../lib/public-channels.js', () => ({
11
- includePrivateChannels: vi.fn().mockReturnValue(true),
12
- }));
13
- vi.mock('chalk');
14
- import { registerChannelCommand } from '../commands/channel.js';
15
- function createProgram() {
16
- const program = new Command();
17
- program.exitOverride();
18
- registerChannelCommand(program);
19
- return program;
20
- }
21
- describe('channels --workspace conflict', () => {
22
- beforeEach(() => {
23
- vi.clearAllMocks();
24
- });
25
- it('errors when both positional and --workspace are provided', async () => {
26
- const program = createProgram();
27
- await expect(program.parseAsync(['node', 'tw', 'channels', 'Doist', '--workspace', 'Other'])).rejects.toThrow('Cannot specify workspace both as argument and --workspace flag');
28
- });
29
- });
30
- //# sourceMappingURL=channel.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel.test.js","sourceRoot":"","sources":["../../src/__tests__/channel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;CACtD,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;CACxD,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAEhB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,SAAS,aAAa;IAClB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO,CAAC,YAAY,EAAE,CAAA;IACtB,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC3C,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAE/B,MAAM,MAAM,CACR,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAClF,CAAC,OAAO,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=completion.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/completion.test.ts"],"names":[],"mappings":""}
@@ -1,106 +0,0 @@
1
- import { Command, Option } from 'commander';
2
- import { describe, expect, it } from 'vitest';
3
- import { getCompletions, parseCompLine, withCaseInsensitiveChoices, withUnvalidatedChoices, } from '../lib/completion.js';
4
- function createTestProgram() {
5
- const program = new Command();
6
- program.name('tw');
7
- const thread = program.command('thread').description('Thread operations');
8
- thread.command('view').description('View thread').option('--json', 'Output as JSON');
9
- thread
10
- .command('reply')
11
- .description('Reply in thread')
12
- .addOption(withUnvalidatedChoices(new Option('--notify <recipients>', 'Notification targets'), [
13
- 'EVERYONE',
14
- 'EVERYONE_IN_THREAD',
15
- ]));
16
- program
17
- .command('search')
18
- .description('Search content')
19
- .addOption(withCaseInsensitiveChoices(new Option('--type <type>', 'Search type'), [
20
- 'threads',
21
- 'messages',
22
- 'all',
23
- ]))
24
- .option('--json', 'Output as JSON');
25
- // Hidden command (like completion-server)
26
- program.command('hidden-cmd', { hidden: true }).description('Internal command');
27
- return program;
28
- }
29
- function names(items) {
30
- return items.map((i) => i.name);
31
- }
32
- describe('getCompletions', () => {
33
- it('returns visible top-level commands', () => {
34
- const program = createTestProgram();
35
- const result = getCompletions(program, [''], '');
36
- expect(names(result)).toContain('thread');
37
- expect(names(result)).toContain('search');
38
- expect(names(result)).not.toContain('hidden-cmd');
39
- });
40
- it('returns subcommands inside a command', () => {
41
- const program = createTestProgram();
42
- const result = getCompletions(program, ['thread', ''], '');
43
- const resultNames = names(result);
44
- expect(resultNames).toContain('view');
45
- expect(resultNames).toContain('reply');
46
- });
47
- it('returns options when current word starts with -', () => {
48
- const program = createTestProgram();
49
- const result = getCompletions(program, ['search', '--'], '--');
50
- const resultNames = names(result);
51
- expect(resultNames).toContain('--type');
52
- expect(resultNames).toContain('--json');
53
- });
54
- it('suggests option values from argChoices', () => {
55
- const program = createTestProgram();
56
- const result = getCompletions(program, ['search', '--type', ''], '');
57
- expect(names(result)).toEqual(['threads', 'messages', 'all']);
58
- });
59
- it('supports --flag=value completion', () => {
60
- const program = createTestProgram();
61
- const result = getCompletions(program, ['search', '--type='], '--type=');
62
- expect(names(result)).toEqual(['--type=threads', '--type=messages', '--type=all']);
63
- });
64
- it('supports unvalidated choices for options with extra accepted formats', () => {
65
- const program = createTestProgram();
66
- const result = getCompletions(program, ['thread', 'reply', '--notify', ''], '');
67
- expect(names(result)).toEqual(['EVERYONE', 'EVERYONE_IN_THREAD']);
68
- });
69
- it('stops offering options after --', () => {
70
- const program = createTestProgram();
71
- const result = getCompletions(program, ['search', '--', '--ty'], '--ty');
72
- expect(result).toEqual([]);
73
- });
74
- });
75
- describe('parseCompLine quoted argument limitation', () => {
76
- it('splits quoted multi-word arguments into separate tokens', () => {
77
- const result = parseCompLine('tw thread reply "hello world"');
78
- expect(result).toEqual(['thread', 'reply', '"hello', 'world"']);
79
- });
80
- it('strips completion-server token', () => {
81
- const result = parseCompLine('tw completion-server thread rep');
82
- expect(result).toEqual(['thread', 'rep']);
83
- });
84
- });
85
- // These tests verify assumptions we make about Commander internals.
86
- describe('Commander internal assumptions', () => {
87
- it('choices() sets parseArg on the option', () => {
88
- const opt = new Option('--color <c>', 'Pick a color');
89
- expect(opt.parseArg).toBeUndefined();
90
- opt.choices(['red', 'blue']);
91
- expect(opt.parseArg).toBeTypeOf('function');
92
- });
93
- it('argChoices set directly is readable by option consumers', () => {
94
- const opt = new Option('--role <r>', 'Role');
95
- opt.argChoices = ['ADMIN', 'MEMBER'];
96
- expect(opt.argChoices).toEqual(['ADMIN', 'MEMBER']);
97
- });
98
- it('{ hidden: true } sets _hidden on the command', () => {
99
- const program = new Command();
100
- const visible = program.command('visible');
101
- const hidden = program.command('secret', { hidden: true });
102
- expect(visible._hidden).toBe(false);
103
- expect(hidden._hidden).toBe(true);
104
- });
105
- });
106
- //# sourceMappingURL=completion.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion.test.js","sourceRoot":"","sources":["../../src/__tests__/completion.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=conversation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conversation.test.ts"],"names":[],"mappings":""}
@@ -1,47 +0,0 @@
1
- import { Command } from 'commander';
2
- import { beforeEach, describe, expect, it, vi } from 'vitest';
3
- vi.mock('../lib/api.js', () => ({
4
- getTwistClient: vi.fn().mockRejectedValue(new Error('MOCK_API_REACHED')),
5
- getCurrentWorkspaceId: vi.fn().mockResolvedValue(1),
6
- }));
7
- vi.mock('../lib/refs.js', () => ({
8
- resolveConversationId: vi.fn().mockReturnValue(100),
9
- resolveWorkspaceRef: vi.fn(),
10
- }));
11
- vi.mock('../lib/markdown.js', () => ({
12
- renderMarkdown: vi.fn((text) => text),
13
- }));
14
- vi.mock('chalk');
15
- import { registerConversationCommand } from '../commands/conversation.js';
16
- function createProgram() {
17
- const program = new Command();
18
- program.exitOverride();
19
- registerConversationCommand(program);
20
- return program;
21
- }
22
- describe('conversation implicit view', () => {
23
- beforeEach(() => {
24
- vi.clearAllMocks();
25
- });
26
- it('tw conversation <ref> routes to view (not unknown command)', async () => {
27
- const program = createProgram();
28
- const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
29
- await expect(program.parseAsync(['node', 'tw', 'conversation', '100'])).rejects.toThrow('MOCK_API_REACHED');
30
- consoleSpy.mockRestore();
31
- });
32
- });
33
- describe('conversation unread --workspace conflict', () => {
34
- it('errors when both positional and --workspace are provided', async () => {
35
- const program = createProgram();
36
- await expect(program.parseAsync([
37
- 'node',
38
- 'tw',
39
- 'conversation',
40
- 'unread',
41
- 'Doist',
42
- '--workspace',
43
- 'Other',
44
- ])).rejects.toThrow('Cannot specify workspace both as argument and --workspace flag');
45
- });
46
- });
47
- //# sourceMappingURL=conversation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.test.js","sourceRoot":"","sources":["../../src/__tests__/conversation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxE,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;CACtD,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;IACnD,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;CAChD,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAEhB,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAEzE,SAAS,aAAa;IAClB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO,CAAC,YAAY,EAAE,CAAA;IACtB,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACpC,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACxC,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAExE,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACnF,kBAAkB,CACrB,CAAA;QAED,UAAU,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAE/B,MAAM,MAAM,CACR,OAAO,CAAC,UAAU,CAAC;YACf,MAAM;YACN,IAAI;YACJ,cAAc;YACd,QAAQ;YACR,OAAO;YACP,aAAa;YACb,OAAO;SACV,CAAC,CACL,CAAC,OAAO,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=inbox.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inbox.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/inbox.test.ts"],"names":[],"mappings":""}
@@ -1,31 +0,0 @@
1
- import { Command } from 'commander';
2
- import { beforeEach, describe, expect, it, vi } from 'vitest';
3
- vi.mock('../lib/api.js', () => ({
4
- getTwistClient: vi.fn(),
5
- getCurrentWorkspaceId: vi.fn().mockResolvedValue(1),
6
- }));
7
- vi.mock('../lib/refs.js', () => ({
8
- resolveWorkspaceRef: vi.fn(),
9
- }));
10
- vi.mock('../lib/public-channels.js', () => ({
11
- includePrivateChannels: vi.fn().mockReturnValue(true),
12
- getPublicChannelIds: vi.fn(),
13
- }));
14
- vi.mock('chalk');
15
- import { registerInboxCommand } from '../commands/inbox.js';
16
- function createProgram() {
17
- const program = new Command();
18
- program.exitOverride();
19
- registerInboxCommand(program);
20
- return program;
21
- }
22
- describe('inbox --workspace conflict', () => {
23
- beforeEach(() => {
24
- vi.clearAllMocks();
25
- });
26
- it('errors when both positional and --workspace are provided', async () => {
27
- const program = createProgram();
28
- await expect(program.parseAsync(['node', 'tw', 'inbox', 'Doist', '--workspace', 'Other'])).rejects.toThrow('Cannot specify workspace both as argument and --workspace flag');
29
- });
30
- });
31
- //# sourceMappingURL=inbox.test.js.map