@relace-ai/jacq 0.1.1-beta.1 → 0.1.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 (106) hide show
  1. package/dist/actions/messages.d.ts +41 -0
  2. package/dist/actions/messages.js +77 -0
  3. package/dist/actions/messages.js.map +1 -0
  4. package/dist/actions/prompts.d.ts +6 -0
  5. package/dist/actions/prompts.js +18 -0
  6. package/dist/actions/prompts.js.map +1 -0
  7. package/dist/actions/tasks.d.ts +13 -0
  8. package/dist/actions/tasks.js +66 -0
  9. package/dist/actions/tasks.js.map +1 -0
  10. package/dist/auth.d.ts +12 -0
  11. package/dist/auth.js +131 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/clipboard.d.ts +21 -0
  14. package/dist/clipboard.js +126 -0
  15. package/dist/clipboard.js.map +1 -0
  16. package/dist/commands.d.ts +15 -0
  17. package/dist/commands.js +23 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/config.d.ts +12 -0
  20. package/dist/config.js +63 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/connection.d.ts +43 -0
  23. package/dist/connection.js +231 -0
  24. package/dist/connection.js.map +1 -0
  25. package/dist/constants.d.ts +2 -0
  26. package/dist/constants.js +3 -0
  27. package/dist/constants.js.map +1 -0
  28. package/dist/debug.d.ts +96 -0
  29. package/dist/debug.js +144 -0
  30. package/dist/debug.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.js +390 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/markdown/index.d.ts +11 -0
  35. package/dist/markdown/index.js +12 -0
  36. package/dist/markdown/index.js.map +1 -0
  37. package/dist/markdown/parser.d.ts +22 -0
  38. package/dist/markdown/parser.js +310 -0
  39. package/dist/markdown/parser.js.map +1 -0
  40. package/dist/markdown/renderer.d.ts +23 -0
  41. package/dist/markdown/renderer.js +358 -0
  42. package/dist/markdown/renderer.js.map +1 -0
  43. package/dist/markdown/types.d.ts +74 -0
  44. package/dist/markdown/types.js +12 -0
  45. package/dist/markdown/types.js.map +1 -0
  46. package/dist/protocol.d.ts +46 -0
  47. package/dist/protocol.js +608 -0
  48. package/dist/protocol.js.map +1 -0
  49. package/dist/renderer.d.ts +46 -0
  50. package/dist/renderer.js +144 -0
  51. package/dist/renderer.js.map +1 -0
  52. package/dist/screen.d.ts +34 -0
  53. package/dist/screen.js +167 -0
  54. package/dist/screen.js.map +1 -0
  55. package/dist/state.d.ts +6 -0
  56. package/dist/state.js +77 -0
  57. package/dist/state.js.map +1 -0
  58. package/dist/styles.d.ts +16 -0
  59. package/dist/styles.js +68 -0
  60. package/dist/styles.js.map +1 -0
  61. package/dist/terminal.d.ts +46 -0
  62. package/dist/terminal.js +67 -0
  63. package/dist/terminal.js.map +1 -0
  64. package/dist/tools/executor.d.ts +8 -0
  65. package/dist/tools/executor.js +20 -0
  66. package/dist/tools/executor.js.map +1 -0
  67. package/dist/tools/index.d.ts +5 -0
  68. package/dist/tools/index.js +6 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/registry.d.ts +32 -0
  71. package/dist/tools/registry.js +344 -0
  72. package/dist/tools/registry.js.map +1 -0
  73. package/dist/types.d.ts +200 -0
  74. package/dist/types.js +5 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/ui/backgroundTasks.d.ts +7 -0
  77. package/dist/ui/backgroundTasks.js +192 -0
  78. package/dist/ui/backgroundTasks.js.map +1 -0
  79. package/dist/ui/filePicker.d.ts +9 -0
  80. package/dist/ui/filePicker.js +315 -0
  81. package/dist/ui/filePicker.js.map +1 -0
  82. package/dist/ui/index.d.ts +33 -0
  83. package/dist/ui/index.js +289 -0
  84. package/dist/ui/index.js.map +1 -0
  85. package/dist/ui/input.d.ts +7 -0
  86. package/dist/ui/input.js +320 -0
  87. package/dist/ui/input.js.map +1 -0
  88. package/dist/ui/messages.d.ts +9 -0
  89. package/dist/ui/messages.js +329 -0
  90. package/dist/ui/messages.js.map +1 -0
  91. package/dist/ui/primitives.d.ts +35 -0
  92. package/dist/ui/primitives.js +94 -0
  93. package/dist/ui/primitives.js.map +1 -0
  94. package/dist/ui/promptInput.d.ts +8 -0
  95. package/dist/ui/promptInput.js +198 -0
  96. package/dist/ui/promptInput.js.map +1 -0
  97. package/dist/ui/promptPicker.d.ts +7 -0
  98. package/dist/ui/promptPicker.js +214 -0
  99. package/dist/ui/promptPicker.js.map +1 -0
  100. package/dist/ui/sessions.d.ts +6 -0
  101. package/dist/ui/sessions.js +214 -0
  102. package/dist/ui/sessions.js.map +1 -0
  103. package/dist/ui/welcome.d.ts +6 -0
  104. package/dist/ui/welcome.js +114 -0
  105. package/dist/ui/welcome.js.map +1 -0
  106. package/package.json +1 -1
@@ -0,0 +1,608 @@
1
+ /**
2
+ * Protocol — Message handlers and client API
3
+ *
4
+ * Handles all incoming WebSocket messages (routing to action functions)
5
+ * and provides the outgoing client API (createTask, cancelTask, etc.).
6
+ */
7
+ import { connection } from './connection.js';
8
+ import { state, markDirty } from './state.js';
9
+ import { addMessage, appendStream, flushStream } from './actions/messages.js';
10
+ import { setConnected, setDisconnected, setServerStatus, setServerUrl, setTasks, updateTask, setCurrentTask, setSubmitting, setWidgets, } from './actions/tasks.js';
11
+ import { setPendingPrompt, clearPrompt } from './actions/prompts.js';
12
+ import { saveConfig } from './config.js';
13
+ import debug from './debug.js';
14
+ // --- Initialization ---
15
+ export function init() {
16
+ connection.onMessage = handleMessage;
17
+ connection.onDisconnect = (code, _reason) => {
18
+ setDisconnected();
19
+ setSubmitting(false);
20
+ setActivityPhase('idle');
21
+ if (code === 4001) {
22
+ saveConfig({ apiKey: null });
23
+ state.authenticated = false;
24
+ state.statusMessage = 'Session expired. Type /login to re-authenticate.';
25
+ state.dirty = true;
26
+ }
27
+ };
28
+ }
29
+ function setActivityPhase(phase) {
30
+ state.activityPhase = phase;
31
+ }
32
+ // --- Incoming message handlers ---
33
+ function handleMessage(message) {
34
+ switch (message.type) {
35
+ case 'connected':
36
+ setConnected(message.payload?.clientId || '');
37
+ connection.send({ type: 'status' });
38
+ fetchTasks();
39
+ fetchWidgets();
40
+ connection.registerAsToolClient().catch(() => { });
41
+ break;
42
+ case 'status':
43
+ if (message.payload) {
44
+ setServerStatus(message.payload);
45
+ }
46
+ break;
47
+ case 'task.created':
48
+ case 'task.started':
49
+ case 'task.stream':
50
+ case 'task.step':
51
+ case 'task.user':
52
+ case 'task.completed':
53
+ case 'task.failed':
54
+ case 'task.cancelled':
55
+ handleTaskEvent(message);
56
+ break;
57
+ case 'proxy.status': {
58
+ const payload = message.payload;
59
+ if (payload?.status === 'disconnected') {
60
+ addMessage('status', 'Worker disconnected - will reconnect on next message');
61
+ }
62
+ break;
63
+ }
64
+ case 'proxy.error': {
65
+ const payload = message.payload;
66
+ const errorMsg = payload?.recoverable
67
+ ? `Worker error (will retry): ${payload.error}`
68
+ : `Worker error: ${payload?.error}`;
69
+ addMessage('error', errorMsg);
70
+ break;
71
+ }
72
+ case 'prompt.pending':
73
+ handlePromptPending(message);
74
+ break;
75
+ case 'prompt.answered':
76
+ handlePromptAnswered(message);
77
+ break;
78
+ case 'widget.created':
79
+ handleWidgetCreated(message);
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ function handleTaskEvent(message) {
86
+ const { type, taskId, payload } = message;
87
+ const isCurrentTask = !taskId || taskId === state.currentTaskId;
88
+ debug.logTask(type, taskId, {
89
+ isCurrentTask,
90
+ currentTaskId: state.currentTaskId?.slice(0, 8),
91
+ payloadKeys: payload ? Object.keys(payload) : [],
92
+ });
93
+ switch (type) {
94
+ case 'task.created':
95
+ if (taskId && !state.currentTaskId) {
96
+ setCurrentTask(taskId);
97
+ }
98
+ fetchTasks();
99
+ break;
100
+ case 'task.started':
101
+ updateTask(taskId, { status: 'running' });
102
+ if (isCurrentTask) {
103
+ setSubmitting(false);
104
+ setActivityPhase('waiting_for_first_step');
105
+ }
106
+ break;
107
+ case 'task.user':
108
+ if (isCurrentTask && payload?.content) {
109
+ let content = payload.content;
110
+ if (content.startsWith('Task: '))
111
+ content = content.slice(6);
112
+ if (content.startsWith('New task: '))
113
+ content = content.slice(10);
114
+ const browserStatusIdx = content.indexOf('\n\n(Browser ');
115
+ if (browserStatusIdx !== -1)
116
+ content = content.slice(0, browserStatusIdx);
117
+ content = content.trim();
118
+ debug.logMessage('user', content, { taskId });
119
+ addMessage('user', content, { taskId });
120
+ }
121
+ break;
122
+ case 'task.stream':
123
+ if (isCurrentTask && payload?.chunk) {
124
+ setActivityPhase('streaming');
125
+ appendStream(payload.chunk);
126
+ }
127
+ break;
128
+ case 'task.step':
129
+ if (isCurrentTask) {
130
+ setActivityPhase('streaming');
131
+ flushStream(taskId);
132
+ const stepNum = payload?.step || 1;
133
+ const tokensUsed = payload?.tokensUsed;
134
+ const tokens = tokensUsed ? {
135
+ input: tokensUsed.input || 0,
136
+ output: tokensUsed.output || 0,
137
+ } : null;
138
+ if (tokensUsed) {
139
+ updateTask(taskId, {
140
+ step: stepNum,
141
+ tokensDelta: {
142
+ input: tokensUsed.input || 0,
143
+ output: tokensUsed.output || 0,
144
+ cacheRead: tokensUsed.cache_read || 0,
145
+ cacheCreate: tokensUsed.cache_create || 0,
146
+ },
147
+ });
148
+ }
149
+ debug.logMessage('tool', `Step ${stepNum}`, { taskId, toolCalls: payload?.toolCalls, agentMessage: payload?.agentMessage });
150
+ addMessage('tool', `Step ${stepNum}`, {
151
+ taskId,
152
+ toolCalls: payload?.toolCalls || [],
153
+ agentMessage: payload?.agentMessage || null,
154
+ tokens,
155
+ });
156
+ }
157
+ break;
158
+ case 'task.completed':
159
+ if (isCurrentTask) {
160
+ setSubmitting(false);
161
+ setActivityPhase('idle');
162
+ flushStream(taskId);
163
+ // Add "Done" status message unless the done tool already rendered it
164
+ const hasDoneTool = state.messages.some(m => m.taskId === taskId && m.toolCalls?.some(tc => tc.name === 'done'));
165
+ if (!hasDoneTool) {
166
+ addMessage('status', 'Done', { taskId });
167
+ }
168
+ }
169
+ updateTask(taskId, { status: 'completed' });
170
+ fetchTasks();
171
+ break;
172
+ case 'task.failed':
173
+ if (isCurrentTask) {
174
+ setSubmitting(false);
175
+ setActivityPhase('idle');
176
+ flushStream(taskId);
177
+ addMessage('error', payload?.error || 'Task failed', { taskId });
178
+ }
179
+ updateTask(taskId, { status: 'failed' });
180
+ fetchTasks();
181
+ break;
182
+ case 'task.cancelled':
183
+ if (isCurrentTask) {
184
+ setSubmitting(false);
185
+ setActivityPhase('idle');
186
+ flushStream(taskId);
187
+ // Only add if not already shown (escape handler may have added it)
188
+ const hasCancelMsg = state.messages.some(m => m.taskId === taskId && m.type === 'status' && m.content === 'Cancelled');
189
+ if (!hasCancelMsg) {
190
+ addMessage('status', 'Cancelled', { taskId });
191
+ }
192
+ }
193
+ updateTask(taskId, { status: 'cancelled' });
194
+ fetchTasks();
195
+ break;
196
+ }
197
+ markDirty();
198
+ }
199
+ function handlePromptPending(message) {
200
+ const { taskId, payload } = message;
201
+ if (taskId !== state.currentTaskId)
202
+ return;
203
+ const questions = payload?.questions;
204
+ if (payload?.promptId && questions && questions.length > 0) {
205
+ setPendingPrompt({
206
+ taskId: taskId,
207
+ promptId: payload.promptId,
208
+ questions,
209
+ currentQuestionIndex: 0,
210
+ answers: {},
211
+ contextMessage: payload.contextMessage || null,
212
+ });
213
+ setActivityPhase('awaiting_prompt');
214
+ }
215
+ }
216
+ function handlePromptAnswered(message) {
217
+ const { taskId, payload } = message;
218
+ if (payload?.promptId) {
219
+ updateTask(taskId, { status: 'running' });
220
+ setActivityPhase('waiting_for_first_step');
221
+ }
222
+ markDirty();
223
+ }
224
+ function handleWidgetCreated(message) {
225
+ const { taskId, payload } = message;
226
+ if (!payload?.widgetId)
227
+ return;
228
+ const title = payload.title || 'Untitled';
229
+ const widgetId = payload.widgetId;
230
+ const msg = addMessage('status', `Widget: ${title} — Open ↗`, { taskId });
231
+ fetchWidgetUrl(widgetId).then(url => {
232
+ msg.linkUrl = url;
233
+ markDirty();
234
+ }).catch(() => { });
235
+ fetchWidgets();
236
+ markDirty();
237
+ }
238
+ // --- Outgoing client API ---
239
+ async function fetchTasks() {
240
+ try {
241
+ const resp = await connection.request({
242
+ type: 'task.list',
243
+ payload: { limit: 100 }
244
+ });
245
+ if (resp.success && resp.payload?.tasks) {
246
+ setTasks(resp.payload.tasks);
247
+ }
248
+ else {
249
+ setTasks([]);
250
+ }
251
+ }
252
+ catch {
253
+ setTasks([]);
254
+ }
255
+ }
256
+ export async function createTask(prompt, files = null) {
257
+ if (state.currentTaskId) {
258
+ const task = state.tasks.find(t => t.id === state.currentTaskId);
259
+ if (task && (task.status === 'completed' || task.status === 'failed')) {
260
+ return continueTask(state.currentTaskId, prompt, files);
261
+ }
262
+ }
263
+ try {
264
+ debug.log('TASK', 'Creating task', { prompt: prompt.slice(0, 50), fileCount: files?.length || 0 });
265
+ const payload = { prompt };
266
+ if (files && files.length > 0) {
267
+ payload.files = files;
268
+ }
269
+ const resp = await connection.request({ type: 'task.create', payload });
270
+ const taskId = resp.payload?.taskId;
271
+ if (resp.success && taskId) {
272
+ debug.logTask('task.create.success', taskId);
273
+ setCurrentTask(taskId);
274
+ fetchTasks();
275
+ }
276
+ else {
277
+ setSubmitting(false);
278
+ setActivityPhase('idle');
279
+ debug.logError('createTask', resp.error || resp.payload?.message || 'Unknown error');
280
+ }
281
+ return resp;
282
+ }
283
+ catch (err) {
284
+ setSubmitting(false);
285
+ setActivityPhase('idle');
286
+ debug.logError('createTask', err);
287
+ return null;
288
+ }
289
+ }
290
+ export async function continueTask(taskId, prompt, files = null) {
291
+ try {
292
+ const payload = { taskId, prompt };
293
+ if (files && files.length > 0) {
294
+ payload.files = files;
295
+ }
296
+ const resp = await connection.request({ type: 'task.continue', payload });
297
+ if (!resp.success) {
298
+ setSubmitting(false);
299
+ setActivityPhase('idle');
300
+ }
301
+ return resp;
302
+ }
303
+ catch {
304
+ setSubmitting(false);
305
+ setActivityPhase('idle');
306
+ return null;
307
+ }
308
+ }
309
+ export function refreshTasks() {
310
+ fetchTasks();
311
+ }
312
+ export async function cancelTask(taskId) {
313
+ if (!taskId)
314
+ return null;
315
+ try {
316
+ debug.log('TASK', 'Cancelling task', { taskId: taskId.slice(0, 8) });
317
+ const resp = await connection.request({
318
+ type: 'task.cancel',
319
+ taskId,
320
+ payload: { taskId }
321
+ });
322
+ if (resp.success) {
323
+ debug.logTask('task.cancel.success', taskId);
324
+ if (state.pendingPrompt?.taskId === taskId) {
325
+ clearPrompt();
326
+ }
327
+ }
328
+ else {
329
+ debug.logError('cancelTask', resp.error || 'Unknown error');
330
+ }
331
+ return resp;
332
+ }
333
+ catch (err) {
334
+ debug.logError('cancelTask', err);
335
+ return null;
336
+ }
337
+ }
338
+ export async function respondToPrompt(response) {
339
+ if (!state.pendingPrompt) {
340
+ debug.log('PROMPT', 'No pending prompt to respond to');
341
+ return null;
342
+ }
343
+ const { taskId, promptId, questions, currentQuestionIndex, answers } = state.pendingPrompt;
344
+ const currentQuestion = questions[currentQuestionIndex];
345
+ const questionKey = currentQuestion.header || currentQuestion.question;
346
+ const newAnswers = { ...answers, [questionKey]: response };
347
+ debug.log('PROMPT', 'Answering question', {
348
+ taskId: taskId?.slice(0, 8),
349
+ promptId: promptId?.slice(0, 8),
350
+ questionIndex: currentQuestionIndex,
351
+ totalQuestions: questions.length,
352
+ response: response.slice(0, 50),
353
+ });
354
+ const nextIndex = currentQuestionIndex + 1;
355
+ if (nextIndex < questions.length) {
356
+ state.pendingPrompt = {
357
+ ...state.pendingPrompt,
358
+ currentQuestionIndex: nextIndex,
359
+ answers: newAnswers,
360
+ };
361
+ state.promptPickerIndex = 0;
362
+ state.promptFreeInput = false;
363
+ state.promptInputText = '';
364
+ state.promptInputCursor = 0;
365
+ markDirty();
366
+ return null;
367
+ }
368
+ try {
369
+ const resp = await connection.request({
370
+ type: 'prompt.respond',
371
+ taskId,
372
+ payload: {
373
+ promptId,
374
+ response: newAnswers,
375
+ },
376
+ });
377
+ if (resp.success) {
378
+ debug.log('PROMPT', 'Prompt response accepted');
379
+ clearPrompt();
380
+ setActivityPhase('waiting_for_first_step');
381
+ }
382
+ else {
383
+ debug.logError('respondToPrompt', resp.error || 'Unknown error');
384
+ }
385
+ return resp;
386
+ }
387
+ catch (err) {
388
+ debug.logError('respondToPrompt', err);
389
+ return null;
390
+ }
391
+ }
392
+ export async function subscribeTask(taskId) {
393
+ debug.logTask('subscribe.start', taskId);
394
+ try {
395
+ const resp = await connection.request({
396
+ type: 'task.subscribe',
397
+ taskId,
398
+ payload: {
399
+ messageLimit: 50
400
+ }
401
+ });
402
+ if (resp.success && resp.payload?.task) {
403
+ const taskData = resp.payload.task;
404
+ debug.logTask('subscribe.success', taskId, {
405
+ status: taskData.status,
406
+ messageCount: state.messages.length,
407
+ });
408
+ updateTask(taskId, { status: taskData.status });
409
+ if (taskId === state.currentTaskId) {
410
+ if (taskData.status === 'running' || taskData.status === 'pending') {
411
+ setActivityPhase('waiting_for_first_step');
412
+ }
413
+ else {
414
+ setActivityPhase('idle');
415
+ }
416
+ // Restore pending prompt if task is awaiting input (not terminal)
417
+ const pendingPrompts = resp.payload.pendingPrompts;
418
+ const isTerminal = taskData.status === 'completed' || taskData.status === 'cancelled' || taskData.status === 'failed';
419
+ if (!isTerminal && pendingPrompts && pendingPrompts.length > 0) {
420
+ const p = pendingPrompts[0];
421
+ if (p.questions && p.questions.length > 0) {
422
+ setPendingPrompt({
423
+ taskId,
424
+ promptId: p.promptId,
425
+ questions: p.questions,
426
+ currentQuestionIndex: 0,
427
+ answers: {},
428
+ });
429
+ setActivityPhase('awaiting_prompt');
430
+ }
431
+ }
432
+ }
433
+ fetchTasks();
434
+ markDirty();
435
+ }
436
+ return resp;
437
+ }
438
+ catch (err) {
439
+ debug.logError('subscribeTask', err);
440
+ return null;
441
+ }
442
+ }
443
+ export function reconnect() {
444
+ debug.log('WS', 'Reconnecting...');
445
+ connection.disconnect();
446
+ setSubmitting(false);
447
+ setActivityPhase('idle');
448
+ import('./config.js').then(({ loadConfig }) => {
449
+ const config = loadConfig();
450
+ setServerUrl(config.apiUrl);
451
+ connection.connect(config.apiUrl, config.apiKey);
452
+ });
453
+ }
454
+ export async function ping() {
455
+ const start = Date.now();
456
+ try {
457
+ const resp = await connection.request({ type: 'status' }, 5000);
458
+ const latency = Date.now() - start;
459
+ debug.recordPing(latency);
460
+ if (resp.payload) {
461
+ debug.updateServerStats(resp.payload);
462
+ setServerStatus(resp.payload);
463
+ }
464
+ return { success: true, latency, status: resp.payload };
465
+ }
466
+ catch (err) {
467
+ debug.recordError(err.message);
468
+ markDirty();
469
+ return { success: false, error: err.message };
470
+ }
471
+ }
472
+ export async function healthCheck() {
473
+ const results = {
474
+ timestamp: new Date().toISOString(),
475
+ connection: {
476
+ wsState: connection.getWsState(),
477
+ connected: state.connected,
478
+ clientId: state.clientId?.slice(0, 8),
479
+ serverUrl: state.serverUrl,
480
+ },
481
+ ping: null,
482
+ tasks: null,
483
+ errors: [],
484
+ };
485
+ try {
486
+ results.ping = await ping();
487
+ }
488
+ catch (err) {
489
+ results.errors.push(`Ping failed: ${err.message}`);
490
+ }
491
+ try {
492
+ const resp = await connection.request({ type: 'task.list', payload: { limit: 10 } }, 5000);
493
+ if (resp.success) {
494
+ const tasks = resp.payload?.tasks;
495
+ results.tasks = {
496
+ count: tasks?.length || 0,
497
+ statuses: tasks?.reduce((acc, t) => {
498
+ acc[t.status] = (acc[t.status] || 0) + 1;
499
+ return acc;
500
+ }, {}),
501
+ };
502
+ }
503
+ else {
504
+ results.errors.push('Task list request failed');
505
+ }
506
+ }
507
+ catch (err) {
508
+ results.errors.push(`Task list failed: ${err.message}`);
509
+ }
510
+ debug.log('HEALTH', 'Health check completed', results);
511
+ return results;
512
+ }
513
+ export async function uploadFiles(files) {
514
+ const fs = await import('fs');
515
+ const pathModule = await import('path');
516
+ const crypto = await import('crypto');
517
+ const boundary = `----FormBoundary${crypto.randomBytes(16).toString('hex')}`;
518
+ const parts = [];
519
+ for (const file of files) {
520
+ let fileName;
521
+ let fileContent;
522
+ let mimeType;
523
+ if (typeof file === 'string') {
524
+ const absolutePath = pathModule.resolve(file);
525
+ if (!fs.existsSync(absolutePath)) {
526
+ throw new Error(`File not found: ${file}`);
527
+ }
528
+ fileName = pathModule.basename(absolutePath);
529
+ fileContent = fs.readFileSync(absolutePath);
530
+ mimeType = 'application/octet-stream';
531
+ }
532
+ else {
533
+ fileName = file.name;
534
+ fileContent = Buffer.from(file.base64, 'base64');
535
+ mimeType = file.mimeType || 'application/octet-stream';
536
+ }
537
+ const header = `--${boundary}\r\nContent-Disposition: form-data; name="files"; filename="${fileName}"\r\nContent-Type: ${mimeType}\r\n\r\n`;
538
+ parts.push(Buffer.from(header));
539
+ parts.push(fileContent);
540
+ parts.push(Buffer.from('\r\n'));
541
+ }
542
+ parts.push(Buffer.from(`--${boundary}--\r\n`));
543
+ const body = Buffer.concat(parts);
544
+ const httpUrl = state.serverUrl
545
+ .replace('ws://', 'http://')
546
+ .replace('wss://', 'https://')
547
+ .replace('/ws', '/upload');
548
+ const headers = {
549
+ 'Content-Type': `multipart/form-data; boundary=${boundary}`,
550
+ 'Content-Length': body.length.toString(),
551
+ };
552
+ const config = await import('./config.js');
553
+ const { apiKey } = config.loadConfig();
554
+ if (apiKey) {
555
+ headers['Authorization'] = `Bearer ${apiKey}`;
556
+ }
557
+ const response = await fetch(httpUrl, {
558
+ method: 'POST',
559
+ body,
560
+ headers,
561
+ });
562
+ if (!response.ok) {
563
+ throw new Error(`Upload failed: ${response.statusText}`);
564
+ }
565
+ const result = await response.json();
566
+ if (!result.success) {
567
+ throw new Error('Upload failed');
568
+ }
569
+ return result.files;
570
+ }
571
+ // --- Widget URL resolution ---
572
+ export async function fetchWidgetUrl(widgetId) {
573
+ const httpUrl = state.serverUrl
574
+ .replace('ws://', 'http://')
575
+ .replace('wss://', 'https://')
576
+ .replace('/ws', `/widgets/${widgetId}/url`);
577
+ const { loadConfig } = await import('./config.js');
578
+ const { apiKey } = loadConfig();
579
+ const headers = {};
580
+ if (apiKey)
581
+ headers['Authorization'] = `Bearer ${apiKey}`;
582
+ const response = await fetch(httpUrl, { headers });
583
+ if (!response.ok)
584
+ throw new Error(`Failed: ${response.statusText}`);
585
+ const result = await response.json();
586
+ return result.url;
587
+ }
588
+ // --- Widget fetching ---
589
+ export async function fetchWidgets() {
590
+ if (!connection.isConnected)
591
+ return;
592
+ try {
593
+ const resp = await connection.request({
594
+ type: 'widgets.list',
595
+ }, 5000);
596
+ if (resp.payload?.widgets) {
597
+ setWidgets(resp.payload.widgets);
598
+ }
599
+ else {
600
+ setWidgets([]);
601
+ }
602
+ }
603
+ catch (err) {
604
+ debug.log('WIDGETS', 'Fetch widgets failed', { error: err.message });
605
+ setWidgets([]);
606
+ }
607
+ }
608
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EACH,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAC5D,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EACnD,UAAU,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B,yBAAyB;AAEzB,MAAM,UAAU,IAAI;IAChB,UAAU,CAAC,SAAS,GAAG,aAAa,CAAC;IACrC,UAAU,CAAC,YAAY,GAAG,CAAC,IAAa,EAAE,OAAgB,EAAE,EAAE;QAC1D,eAAe,EAAE,CAAC;QAClB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7B,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,aAAa,GAAG,kDAAkD,CAAC;YACzE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACvB,CAAC;IACL,CAAC,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB;IAC1C,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,oCAAoC;AAEpC,SAAS,aAAa,CAAC,OAAkB;IACrC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW;YACZ,YAAY,CAAE,OAAO,CAAC,OAAO,EAAE,QAAmB,IAAI,EAAE,CAAC,CAAC;YAC1D,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpC,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,UAAU,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAClD,MAAM;QAEV,KAAK,QAAQ;YACT,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;YACD,MAAM;QAEV,KAAK,cAAc,CAAC;QACpB,KAAK,cAAc,CAAC;QACpB,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,gBAAgB,CAAC;QACtB,KAAK,aAAa,CAAC;QACnB,KAAK,gBAAgB;YACjB,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM;QAEV,KAAK,cAAc,CAAC,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,IAAI,OAAO,EAAE,MAAM,KAAK,cAAc,EAAE,CAAC;gBACrC,UAAU,CAAC,QAAQ,EAAE,sDAAsD,CAAC,CAAC;YACjF,CAAC;YACD,MAAM;QACV,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,QAAQ,GAAG,OAAO,EAAE,WAAW;gBACjC,CAAC,CAAC,8BAA8B,OAAO,CAAC,KAAK,EAAE;gBAC/C,CAAC,CAAC,iBAAiB,OAAO,EAAE,KAAK,EAAE,CAAC;YACxC,UAAU,CAAC,OAAO,EAAE,QAAkB,CAAC,CAAC;YACxC,MAAM;QACV,CAAC;QAED,KAAK,gBAAgB;YACjB,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;QAEV,KAAK,iBAAiB;YAClB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM;QAEV,KAAK,gBAAgB;YACjB,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;QAEV;YACI,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAAkB;IACvC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC,aAAa,CAAC;IAEhE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE;QACxB,aAAa;QACb,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KACnD,CAAC,CAAC;IAEH,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,cAAc;YACf,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBACjC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;YACD,UAAU,EAAE,CAAC;YACb,MAAM;QAEV,KAAK,cAAc;YACf,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1C,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM;QAEV,KAAK,WAAW;YACZ,IAAI,aAAa,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;gBACpC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAiB,CAAC;gBACxC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;oBAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC1D,IAAI,gBAAgB,KAAK,CAAC,CAAC;oBAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAC1E,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAEzB,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9C,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM;QAEV,KAAK,aAAa;YACd,IAAI,aAAa,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBAClC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC9B,YAAY,CAAC,OAAO,CAAC,KAAe,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM;QAEV,KAAK,WAAW;YACZ,IAAI,aAAa,EAAE,CAAC;gBAChB,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC9B,WAAW,CAAC,MAAM,CAAC,CAAC;gBAEpB,MAAM,OAAO,GAAI,OAAO,EAAE,IAAe,IAAI,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,OAAO,EAAE,UAAyG,CAAC;gBACtI,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;oBACxB,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;oBAC5B,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC;iBACjC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAET,IAAI,UAAU,EAAE,CAAC;oBACb,UAAU,CAAC,MAAM,EAAE;wBACf,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE;4BACT,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;4BAC5B,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC;4BAC9B,SAAS,EAAE,UAAU,CAAC,UAAU,IAAI,CAAC;4BACrC,WAAW,EAAE,UAAU,CAAC,YAAY,IAAI,CAAC;yBAC5C;qBACJ,CAAC,CAAC;gBACP,CAAC;gBAED,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAsB,EAAE,YAAY,EAAE,OAAO,EAAE,YAAsB,EAAE,CAAC,CAAC;gBACnJ,UAAU,CAAC,MAAM,EAAE,QAAQ,OAAO,EAAE,EAAE;oBAClC,MAAM;oBACN,SAAS,EAAG,OAAO,EAAE,SAAqE,IAAI,EAAE;oBAChG,YAAY,EAAG,OAAO,EAAE,YAAuB,IAAI,IAAI;oBACvD,MAAM;iBACT,CAAC,CAAC;YAEP,CAAC;YACD,MAAM;QAEV,KAAK,gBAAgB;YACjB,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACzB,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpB,qEAAqE;gBACrE,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAC1E,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACf,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;YACD,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC;YACb,MAAM;QAEV,KAAK,aAAa;YACd,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACzB,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpB,UAAU,CAAC,OAAO,EAAG,OAAO,EAAE,KAAgB,IAAI,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzC,UAAU,EAAE,CAAC;YACb,MAAM;QAEV,KAAK,gBAAgB;YACjB,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACzB,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpB,mEAAmE;gBACnE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAC/E,CAAC;gBACF,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChB,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClD,CAAC;YACL,CAAC;YACD,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC;YACb,MAAM;IACd,CAAC;IAED,SAAS,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAkB;IAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,MAAM,KAAK,KAAK,CAAC,aAAa;QAAE,OAAO;IAE3C,MAAM,SAAS,GAAG,OAAO,EAAE,SAA+H,CAAC;IAE3J,IAAI,OAAO,EAAE,QAAQ,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,gBAAgB,CAAC;YACb,MAAM,EAAE,MAAO;YACf,QAAQ,EAAE,OAAO,CAAC,QAAkB;YACpC,SAAS;YACT,oBAAoB,EAAE,CAAC;YACvB,OAAO,EAAE,EAAE;YACX,cAAc,EAAG,OAAO,CAAC,cAAyB,IAAI,IAAI;SAC7D,CAAC,CAAC;QACH,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAkB;IAC5C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpB,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1C,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAC/C,CAAC;IACD,SAAS,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAkB;IAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,QAAQ;QAAE,OAAO;IAE/B,MAAM,KAAK,GAAI,OAAO,CAAC,KAAgB,IAAI,UAAU,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;IAE5C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,WAAW,KAAK,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1E,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAChC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;QAClB,SAAS,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEnB,YAAY,EAAE,CAAC;IACf,SAAS,EAAE,CAAC;AAChB,CAAC;AAED,8BAA8B;AAE9B,KAAK,UAAU,UAAU;IACrB,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAuF,CAAC,CAAC;QACnH,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,QAA4E,IAAI;IAC7H,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YACpE,OAAO,YAAY,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QAEnG,MAAM,OAAO,GAA4B,EAAE,MAAM,EAAE,CAAC;QACpD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAA4B,CAAC;QAC1D,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7C,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,UAAU,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACJ,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,IAAK,IAAI,CAAC,OAAO,EAAE,OAAkB,IAAI,eAAe,CAAC,CAAC;QACrG,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,QAA4E,IAAI;IAC/I,IAAI,CAAC;QACD,MAAM,OAAO,GAA4B,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,UAAU,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAqB;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,aAAa;YACnB,MAAM;YACN,OAAO,EAAE,EAAE,MAAM,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzC,WAAW,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IAClD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC;IAC3F,MAAM,eAAe,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC;IAEvE,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;IAE3D,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,oBAAoB,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3B,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,aAAa,EAAE,oBAAoB;QACnC,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAClC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,oBAAoB,GAAG,CAAC,CAAC;IAE3C,IAAI,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,aAAa,GAAG;YAClB,GAAG,KAAK,CAAC,aAAa;YACtB,oBAAoB,EAAE,SAAS;YAC/B,OAAO,EAAE,UAAU;SACtB,CAAC;QACF,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;QAC9B,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC5B,SAAS,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,gBAAgB;YACtB,MAAM;YACN,OAAO,EAAE;gBACL,QAAQ;gBACR,QAAQ,EAAE,UAAU;aACvB;SACJ,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;YAChD,WAAW,EAAE,CAAC;YACd,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAC9C,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,gBAAgB;YACtB,MAAM;YACN,OAAO,EAAE;gBACL,YAAY,EAAE,EAAE;aACnB;SACJ,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAA0B,CAAC;YACzD,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,EAAE;gBACvC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aACtC,CAAC,CAAC;YACH,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjE,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACJ,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;gBAED,kEAAkE;gBAClE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAItB,CAAC;gBACf,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC;gBACtH,IAAI,CAAC,UAAU,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,gBAAgB,CAAC;4BACb,MAAM;4BACN,QAAQ,EAAE,CAAC,CAAC,QAAQ;4BACpB,SAAS,EAAE,CAAC,CAAC,SAAS;4BACtB,oBAAoB,EAAE,CAAC;4BACvB,OAAO,EAAE,EAAE;yBACd,CAAC,CAAC;wBACH,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;oBACxC,CAAC;gBACL,CAAC;YACL,CAAC;YACD,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS;IACrB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACnC,UAAU,CAAC,UAAU,EAAE,CAAC;IACxB,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAA4E,CAAC,CAAC;YAC3G,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,WAAW,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,MAAM,OAAO,GAAgH;QACzH,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE;YACR,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B;QACD,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,EAAE;KACb,CAAC;IAEF,IAAI,CAAC;QACD,OAAO,CAAC,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAA8C,CAAC;YAC3E,OAAO,CAAC,KAAK,GAAG;gBACZ,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;gBACzB,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAA2B,EAAE,CAAC,EAAE,EAAE;oBACvD,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBACzC,OAAO,GAAG,CAAC;gBACf,CAAC,EAAE,EAAE,CAAC;aACT,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA0E;IACxG,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,mBAAmB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,QAAgB,CAAC;QACrB,IAAI,WAAmB,CAAC;QACxB,IAAI,QAAgB,CAAC;QAErB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;YACD,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7C,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC5C,QAAQ,GAAG,0BAA0B,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YACrB,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACjD,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,0BAA0B,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,QAAQ,+DAA+D,QAAQ,sBAAsB,QAAQ,UAAU,CAAC;QAC5I,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,QAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS;SAC1B,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;SAC7B,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAE/B,MAAM,OAAO,GAA2B;QACpC,cAAc,EAAE,iCAAiC,QAAQ,EAAE;QAC3D,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;KAC3C,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACvC,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;QAClC,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,OAAO;KACV,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyE,CAAC;IAC5G,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC;AACxB,CAAC;AAED,gCAAgC;AAEhC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS;SAC1B,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;SAC7B,OAAO,CAAC,KAAK,EAAE,YAAY,QAAQ,MAAM,CAAC,CAAC;IAChD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAChC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;IACxD,OAAO,MAAM,CAAC,GAAG,CAAC;AACtB,CAAC;AAED,0BAA0B;AAE1B,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,IAAI,CAAC,UAAU,CAAC,WAAW;QAAE,OAAO;IAEpC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,cAAc;SACvB,EAAE,IAAI,CAAC,CAAC;QAET,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAA+C,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAsB,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,UAAU,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACL,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Renderer - Double-buffered full-screen renderer
3
+ *
4
+ * The render loop:
5
+ * 1. App draws to Screen (front buffer)
6
+ * 2. Diff against previous Screen (back buffer)
7
+ * 3. Generate minimal cursor movements + character writes
8
+ * 4. Write to terminal wrapped in SYNC
9
+ * 5. Swap buffers
10
+ */
11
+ import { Screen } from './screen.js';
12
+ import { StylePool } from './styles.js';
13
+ import type { WriteStream } from 'tty';
14
+ export interface RenderStats {
15
+ changes: number;
16
+ bytes: number;
17
+ time: number;
18
+ }
19
+ export declare class Renderer {
20
+ stdout: WriteStream;
21
+ width: number;
22
+ height: number;
23
+ front: Screen;
24
+ back: Screen | null;
25
+ stylePool: StylePool;
26
+ cursorX: number;
27
+ cursorY: number;
28
+ stats: {
29
+ frames: number;
30
+ cellsChanged: number;
31
+ bytesWritten: number;
32
+ };
33
+ constructor(stdout: WriteStream);
34
+ getScreen(): Screen;
35
+ getStylePool(): StylePool;
36
+ render(): RenderStats;
37
+ clear(): void;
38
+ setup(): void;
39
+ cleanup(): void;
40
+ getStats(): {
41
+ frames: number;
42
+ cellsChanged: number;
43
+ bytesWritten: number;
44
+ };
45
+ }
46
+ export default Renderer;