copilot-liku-cli 0.0.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 (71) hide show
  1. package/ARCHITECTURE.md +411 -0
  2. package/CONFIGURATION.md +302 -0
  3. package/CONTRIBUTING.md +225 -0
  4. package/ELECTRON_README.md +121 -0
  5. package/INSTALLATION.md +350 -0
  6. package/LICENSE.md +1 -0
  7. package/PROJECT_STATUS.md +229 -0
  8. package/QUICKSTART.md +255 -0
  9. package/README.md +167 -0
  10. package/TESTING.md +274 -0
  11. package/package.json +61 -0
  12. package/scripts/start.js +30 -0
  13. package/src/assets/tray-icon.png +0 -0
  14. package/src/cli/commands/agent.js +327 -0
  15. package/src/cli/commands/click.js +108 -0
  16. package/src/cli/commands/drag.js +85 -0
  17. package/src/cli/commands/find.js +109 -0
  18. package/src/cli/commands/keys.js +132 -0
  19. package/src/cli/commands/mouse.js +79 -0
  20. package/src/cli/commands/repl.js +290 -0
  21. package/src/cli/commands/screenshot.js +72 -0
  22. package/src/cli/commands/scroll.js +74 -0
  23. package/src/cli/commands/start.js +67 -0
  24. package/src/cli/commands/type.js +57 -0
  25. package/src/cli/commands/wait.js +84 -0
  26. package/src/cli/commands/window.js +104 -0
  27. package/src/cli/liku.js +249 -0
  28. package/src/cli/util/output.js +174 -0
  29. package/src/main/agents/base-agent.js +410 -0
  30. package/src/main/agents/builder.js +484 -0
  31. package/src/main/agents/index.js +62 -0
  32. package/src/main/agents/orchestrator.js +362 -0
  33. package/src/main/agents/researcher.js +511 -0
  34. package/src/main/agents/state-manager.js +344 -0
  35. package/src/main/agents/supervisor.js +365 -0
  36. package/src/main/agents/verifier.js +452 -0
  37. package/src/main/ai-service.js +1633 -0
  38. package/src/main/index.js +2208 -0
  39. package/src/main/inspect-service.js +467 -0
  40. package/src/main/system-automation.js +1186 -0
  41. package/src/main/ui-automation/config.js +76 -0
  42. package/src/main/ui-automation/core/helpers.js +41 -0
  43. package/src/main/ui-automation/core/index.js +15 -0
  44. package/src/main/ui-automation/core/powershell.js +82 -0
  45. package/src/main/ui-automation/elements/finder.js +274 -0
  46. package/src/main/ui-automation/elements/index.js +14 -0
  47. package/src/main/ui-automation/elements/wait.js +66 -0
  48. package/src/main/ui-automation/index.js +164 -0
  49. package/src/main/ui-automation/interactions/element-click.js +211 -0
  50. package/src/main/ui-automation/interactions/high-level.js +230 -0
  51. package/src/main/ui-automation/interactions/index.js +47 -0
  52. package/src/main/ui-automation/keyboard/index.js +15 -0
  53. package/src/main/ui-automation/keyboard/input.js +179 -0
  54. package/src/main/ui-automation/mouse/click.js +186 -0
  55. package/src/main/ui-automation/mouse/drag.js +88 -0
  56. package/src/main/ui-automation/mouse/index.js +30 -0
  57. package/src/main/ui-automation/mouse/movement.js +51 -0
  58. package/src/main/ui-automation/mouse/scroll.js +116 -0
  59. package/src/main/ui-automation/screenshot.js +183 -0
  60. package/src/main/ui-automation/window/index.js +23 -0
  61. package/src/main/ui-automation/window/manager.js +305 -0
  62. package/src/main/utils/time.js +62 -0
  63. package/src/main/visual-awareness.js +597 -0
  64. package/src/renderer/chat/chat.js +671 -0
  65. package/src/renderer/chat/index.html +725 -0
  66. package/src/renderer/chat/preload.js +112 -0
  67. package/src/renderer/overlay/index.html +648 -0
  68. package/src/renderer/overlay/overlay.js +782 -0
  69. package/src/renderer/overlay/preload.js +90 -0
  70. package/src/shared/grid-math.js +82 -0
  71. package/src/shared/inspect-types.js +230 -0
@@ -0,0 +1,725 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';">
7
+ <title>Copilot Agent Chat</title>
8
+ <style>
9
+ * {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ :root {
16
+ --bg-primary: #1e1e1e;
17
+ --bg-secondary: #252526;
18
+ --bg-tertiary: #2d2d30;
19
+ --bg-hover: #3e3e42;
20
+ --border-color: #3e3e42;
21
+ --text-primary: #cccccc;
22
+ --text-secondary: #858585;
23
+ --accent-blue: #0e639c;
24
+ --accent-blue-hover: #1177bb;
25
+ --accent-green: #14a085;
26
+ --accent-red: #f14c4c;
27
+ }
28
+
29
+ body {
30
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
31
+ background: var(--bg-primary);
32
+ color: var(--text-primary);
33
+ height: 100vh;
34
+ display: flex;
35
+ flex-direction: column;
36
+ overflow: hidden;
37
+ }
38
+
39
+ /* ===== CUSTOM TITLEBAR ===== */
40
+ #titlebar {
41
+ background: var(--bg-secondary);
42
+ padding: 0;
43
+ height: 32px;
44
+ display: flex;
45
+ justify-content: space-between;
46
+ align-items: center;
47
+ -webkit-app-region: drag;
48
+ -webkit-user-select: none;
49
+ user-select: none;
50
+ border-bottom: 1px solid var(--border-color);
51
+ }
52
+
53
+ #titlebar-title {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: 8px;
57
+ padding-left: 12px;
58
+ font-size: 12px;
59
+ color: var(--text-secondary);
60
+ }
61
+
62
+ #titlebar-title .icon {
63
+ width: 16px;
64
+ height: 16px;
65
+ background: linear-gradient(135deg, var(--accent-blue), var(--accent-green));
66
+ border-radius: 4px;
67
+ }
68
+
69
+ #titlebar-controls {
70
+ display: flex;
71
+ -webkit-app-region: no-drag;
72
+ height: 100%;
73
+ }
74
+
75
+ .titlebar-button {
76
+ width: 46px;
77
+ height: 100%;
78
+ border: none;
79
+ background: transparent;
80
+ color: var(--text-secondary);
81
+ font-size: 10px;
82
+ cursor: pointer;
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ transition: background 0.1s, color 0.1s;
87
+ }
88
+
89
+ .titlebar-button:hover {
90
+ background: var(--bg-hover);
91
+ color: var(--text-primary);
92
+ }
93
+
94
+ .titlebar-button.close:hover {
95
+ background: var(--accent-red);
96
+ color: white;
97
+ }
98
+
99
+ .titlebar-button svg {
100
+ width: 10px;
101
+ height: 10px;
102
+ }
103
+
104
+ /* ===== TOOLBAR ===== */
105
+ #toolbar {
106
+ background: var(--bg-secondary);
107
+ padding: 8px 12px;
108
+ border-bottom: 1px solid var(--border-color);
109
+ display: flex;
110
+ justify-content: space-between;
111
+ align-items: center;
112
+ gap: 8px;
113
+ }
114
+
115
+ #mode-controls {
116
+ display: flex;
117
+ gap: 4px;
118
+ }
119
+
120
+ .mode-button {
121
+ background: var(--bg-tertiary);
122
+ color: var(--text-secondary);
123
+ border: 1px solid var(--border-color);
124
+ padding: 5px 12px;
125
+ border-radius: 4px;
126
+ font-size: 11px;
127
+ cursor: pointer;
128
+ transition: all 0.15s;
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 6px;
132
+ }
133
+
134
+ .mode-button:hover {
135
+ background: var(--bg-hover);
136
+ color: var(--text-primary);
137
+ border-color: var(--text-secondary);
138
+ }
139
+
140
+ .mode-button.active {
141
+ background: var(--accent-blue);
142
+ color: white;
143
+ border-color: var(--accent-blue);
144
+ }
145
+
146
+ .mode-button .indicator {
147
+ width: 6px;
148
+ height: 6px;
149
+ border-radius: 50%;
150
+ background: currentColor;
151
+ opacity: 0.5;
152
+ }
153
+
154
+ .mode-button.active .indicator {
155
+ background: #00ff88;
156
+ opacity: 1;
157
+ animation: pulse 1.5s ease-in-out infinite;
158
+ }
159
+
160
+ @keyframes pulse {
161
+ 0%, 100% { opacity: 1; }
162
+ 50% { opacity: 0.5; }
163
+ }
164
+
165
+ #action-controls {
166
+ display: flex;
167
+ gap: 4px;
168
+ }
169
+
170
+ .action-button {
171
+ background: transparent;
172
+ color: var(--text-secondary);
173
+ border: none;
174
+ width: 28px;
175
+ height: 28px;
176
+ border-radius: 4px;
177
+ cursor: pointer;
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ transition: all 0.15s;
182
+ }
183
+
184
+ .action-button:hover {
185
+ background: var(--bg-hover);
186
+ color: var(--text-primary);
187
+ }
188
+
189
+ .action-button.capture {
190
+ color: var(--accent-green);
191
+ }
192
+
193
+ .action-button.capture:hover {
194
+ background: rgba(20, 160, 133, 0.2);
195
+ }
196
+
197
+ .action-button svg {
198
+ width: 14px;
199
+ height: 14px;
200
+ }
201
+
202
+ /* ===== PROVIDER BAR ===== */
203
+ #provider-bar {
204
+ display: flex;
205
+ justify-content: space-between;
206
+ align-items: center;
207
+ padding: 6px 10px;
208
+ background: var(--bg-tertiary);
209
+ border-bottom: 1px solid var(--border-color);
210
+ font-size: 11px;
211
+ }
212
+
213
+ #provider-selector {
214
+ display: flex;
215
+ align-items: center;
216
+ gap: 6px;
217
+ }
218
+
219
+ #provider-selector label {
220
+ color: var(--text-secondary);
221
+ }
222
+
223
+ #provider-select,
224
+ #model-select {
225
+ background: var(--bg-secondary);
226
+ border: 1px solid var(--border-color);
227
+ border-radius: 4px;
228
+ color: var(--text-primary);
229
+ padding: 3px 6px;
230
+ font-size: 10px;
231
+ cursor: pointer;
232
+ max-width: 100px;
233
+ }
234
+
235
+ #model-select {
236
+ max-width: 130px;
237
+ }
238
+
239
+ #provider-select:hover,
240
+ #model-select:hover {
241
+ border-color: var(--accent-blue);
242
+ }
243
+
244
+ #provider-select:focus,
245
+ #model-select:focus {
246
+ outline: none;
247
+ border-color: var(--accent-blue);
248
+ box-shadow: 0 0 0 2px rgba(30, 144, 255, 0.2);
249
+ }
250
+
251
+ #provider-status {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 8px;
255
+ }
256
+
257
+ .status-badge {
258
+ padding: 3px 8px;
259
+ border-radius: 10px;
260
+ font-size: 10px;
261
+ font-weight: 500;
262
+ }
263
+
264
+ .status-badge.connected {
265
+ background: rgba(20, 160, 133, 0.2);
266
+ color: var(--accent-green);
267
+ }
268
+
269
+ .status-badge.disconnected {
270
+ background: rgba(255, 90, 90, 0.2);
271
+ color: #ff5a5a;
272
+ }
273
+
274
+ .status-badge.pending {
275
+ background: rgba(255, 180, 0, 0.2);
276
+ color: #ffb400;
277
+ }
278
+
279
+ .token-badge {
280
+ padding: 3px 8px;
281
+ border-radius: 10px;
282
+ font-size: 10px;
283
+ background: var(--bg-secondary);
284
+ color: var(--text-secondary);
285
+ }
286
+
287
+ /* ===== CHAT HISTORY ===== */
288
+ #chat-history {
289
+ flex: 1;
290
+ overflow-y: auto;
291
+ padding: 16px;
292
+ display: flex;
293
+ flex-direction: column;
294
+ gap: 12px;
295
+ }
296
+
297
+ #chat-history::-webkit-scrollbar {
298
+ width: 6px;
299
+ }
300
+
301
+ #chat-history::-webkit-scrollbar-track {
302
+ background: transparent;
303
+ }
304
+
305
+ #chat-history::-webkit-scrollbar-thumb {
306
+ background: var(--bg-hover);
307
+ border-radius: 3px;
308
+ }
309
+
310
+ #chat-history::-webkit-scrollbar-thumb:hover {
311
+ background: var(--text-secondary);
312
+ }
313
+
314
+ .message {
315
+ padding: 10px 14px;
316
+ border-radius: 8px;
317
+ max-width: 90%;
318
+ word-wrap: break-word;
319
+ position: relative;
320
+ }
321
+
322
+ .message.user {
323
+ background: var(--accent-blue);
324
+ color: white;
325
+ align-self: flex-end;
326
+ margin-left: auto;
327
+ border-bottom-right-radius: 4px;
328
+ }
329
+
330
+ .message.agent {
331
+ background: var(--bg-tertiary);
332
+ color: var(--text-primary);
333
+ align-self: flex-start;
334
+ border-bottom-left-radius: 4px;
335
+ border: 1px solid var(--border-color);
336
+ }
337
+
338
+ .message.system {
339
+ background: transparent;
340
+ border: 1px dashed var(--border-color);
341
+ color: var(--text-secondary);
342
+ align-self: center;
343
+ font-size: 11px;
344
+ max-width: 100%;
345
+ text-align: center;
346
+ padding: 8px 16px;
347
+ }
348
+
349
+ .message.system.capture {
350
+ border-color: var(--accent-green);
351
+ color: var(--accent-green);
352
+ }
353
+
354
+ .message .timestamp {
355
+ font-size: 9px;
356
+ color: var(--text-secondary);
357
+ margin-top: 6px;
358
+ opacity: 0.7;
359
+ }
360
+
361
+ .message.user .timestamp {
362
+ color: rgba(255,255,255,0.6);
363
+ }
364
+
365
+ /* ===== CONTEXT PANEL (collapsible) ===== */
366
+ #context-panel {
367
+ background: var(--bg-secondary);
368
+ border-top: 1px solid var(--border-color);
369
+ max-height: 0;
370
+ overflow: hidden;
371
+ transition: max-height 0.3s ease;
372
+ }
373
+
374
+ #context-panel.expanded {
375
+ max-height: 200px;
376
+ }
377
+
378
+ #context-header {
379
+ padding: 8px 12px;
380
+ display: flex;
381
+ justify-content: space-between;
382
+ align-items: center;
383
+ cursor: pointer;
384
+ -webkit-user-select: none;
385
+ user-select: none;
386
+ }
387
+
388
+ #context-header:hover {
389
+ background: var(--bg-hover);
390
+ }
391
+
392
+ #context-header h3 {
393
+ font-size: 11px;
394
+ font-weight: 600;
395
+ color: var(--text-secondary);
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 6px;
399
+ }
400
+
401
+ #context-header .count {
402
+ background: var(--accent-blue);
403
+ color: white;
404
+ padding: 1px 6px;
405
+ border-radius: 10px;
406
+ font-size: 10px;
407
+ }
408
+
409
+ #context-content {
410
+ padding: 0 12px 12px;
411
+ overflow-y: auto;
412
+ max-height: 150px;
413
+ }
414
+
415
+ .context-item {
416
+ font-size: 11px;
417
+ color: var(--text-secondary);
418
+ padding: 6px 8px;
419
+ background: var(--bg-tertiary);
420
+ border-radius: 4px;
421
+ margin-bottom: 4px;
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 8px;
425
+ }
426
+
427
+ .context-item .dot-marker {
428
+ width: 8px;
429
+ height: 8px;
430
+ border-radius: 50%;
431
+ background: var(--accent-blue);
432
+ }
433
+
434
+ .context-item .coords {
435
+ color: var(--text-primary);
436
+ font-family: 'SF Mono', monospace;
437
+ }
438
+
439
+ /* ===== INPUT AREA ===== */
440
+ #input-area {
441
+ background: var(--bg-secondary);
442
+ border-top: 1px solid var(--border-color);
443
+ padding: 12px;
444
+ }
445
+
446
+ #input-wrapper {
447
+ display: flex;
448
+ gap: 8px;
449
+ align-items: flex-end;
450
+ }
451
+
452
+ #message-input {
453
+ flex: 1;
454
+ background: var(--bg-tertiary);
455
+ border: 1px solid var(--border-color);
456
+ color: var(--text-primary);
457
+ padding: 10px 14px;
458
+ border-radius: 6px;
459
+ font-size: 13px;
460
+ font-family: inherit;
461
+ outline: none;
462
+ resize: none;
463
+ min-height: 40px;
464
+ max-height: 120px;
465
+ line-height: 1.4;
466
+ }
467
+
468
+ #message-input:focus {
469
+ border-color: var(--accent-blue);
470
+ box-shadow: 0 0 0 2px rgba(14, 99, 156, 0.2);
471
+ }
472
+
473
+ #message-input::placeholder {
474
+ color: var(--text-secondary);
475
+ }
476
+
477
+ #send-button {
478
+ background: var(--accent-blue);
479
+ color: white;
480
+ border: none;
481
+ width: 40px;
482
+ height: 40px;
483
+ border-radius: 6px;
484
+ cursor: pointer;
485
+ display: flex;
486
+ align-items: center;
487
+ justify-content: center;
488
+ transition: background 0.15s;
489
+ }
490
+
491
+ #send-button:hover {
492
+ background: var(--accent-blue-hover);
493
+ }
494
+
495
+ #send-button:disabled {
496
+ background: var(--bg-hover);
497
+ cursor: not-allowed;
498
+ }
499
+
500
+ #send-button svg {
501
+ width: 18px;
502
+ height: 18px;
503
+ }
504
+
505
+ /* ===== KEYBOARD HINTS ===== */
506
+ #keyboard-hints {
507
+ padding: 6px 12px;
508
+ background: var(--bg-tertiary);
509
+ font-size: 10px;
510
+ color: var(--text-secondary);
511
+ display: flex;
512
+ justify-content: center;
513
+ gap: 16px;
514
+ border-top: 1px solid var(--border-color);
515
+ }
516
+
517
+ .hint kbd {
518
+ background: var(--bg-secondary);
519
+ padding: 2px 5px;
520
+ border-radius: 3px;
521
+ border: 1px solid var(--border-color);
522
+ font-family: inherit;
523
+ margin-right: 4px;
524
+ }
525
+
526
+ /* ===== EMPTY STATE ===== */
527
+ .empty-state {
528
+ display: flex;
529
+ flex-direction: column;
530
+ align-items: center;
531
+ justify-content: center;
532
+ height: 100%;
533
+ color: var(--text-secondary);
534
+ text-align: center;
535
+ padding: 30px;
536
+ }
537
+
538
+ .empty-state .logo {
539
+ width: 64px;
540
+ height: 64px;
541
+ background: linear-gradient(135deg, var(--accent-blue), var(--accent-green));
542
+ border-radius: 16px;
543
+ margin-bottom: 20px;
544
+ display: flex;
545
+ align-items: center;
546
+ justify-content: center;
547
+ }
548
+
549
+ .empty-state .logo svg {
550
+ width: 32px;
551
+ height: 32px;
552
+ fill: white;
553
+ }
554
+
555
+ .empty-state h2 {
556
+ font-size: 16px;
557
+ font-weight: 600;
558
+ color: var(--text-primary);
559
+ margin-bottom: 8px;
560
+ }
561
+
562
+ .empty-state p {
563
+ font-size: 12px;
564
+ line-height: 1.6;
565
+ max-width: 280px;
566
+ }
567
+
568
+ .empty-state .shortcuts {
569
+ margin-top: 20px;
570
+ display: flex;
571
+ flex-direction: column;
572
+ gap: 6px;
573
+ }
574
+
575
+ .empty-state .shortcut {
576
+ font-size: 11px;
577
+ display: flex;
578
+ align-items: center;
579
+ gap: 8px;
580
+ }
581
+
582
+ .empty-state .shortcut kbd {
583
+ background: var(--bg-tertiary);
584
+ padding: 3px 8px;
585
+ border-radius: 4px;
586
+ border: 1px solid var(--border-color);
587
+ font-family: 'SF Mono', monospace;
588
+ font-size: 10px;
589
+ }
590
+
591
+ /* ===== RESIZE HANDLE ===== */
592
+ .resize-handle {
593
+ position: absolute;
594
+ background: transparent;
595
+ }
596
+
597
+ .resize-handle.corner {
598
+ width: 16px;
599
+ height: 16px;
600
+ }
601
+
602
+ .resize-handle.nw { top: 0; left: 0; cursor: nw-resize; }
603
+ .resize-handle.ne { top: 0; right: 0; cursor: ne-resize; }
604
+ .resize-handle.sw { bottom: 0; left: 0; cursor: sw-resize; }
605
+ .resize-handle.se { bottom: 0; right: 0; cursor: se-resize; }
606
+ </style>
607
+ </head>
608
+ <body>
609
+ <!-- Custom titlebar -->
610
+ <div id="titlebar">
611
+ <div id="titlebar-title">
612
+ <div class="icon"></div>
613
+ <span>Copilot Agent</span>
614
+ </div>
615
+ <div id="titlebar-controls">
616
+ <button class="titlebar-button minimize" id="minimize-btn" title="Minimize">
617
+ <svg viewBox="0 0 10 1"><rect width="10" height="1" fill="currentColor"/></svg>
618
+ </button>
619
+ <button class="titlebar-button close" id="close-btn" title="Close">
620
+ <svg viewBox="0 0 10 10">
621
+ <path d="M1 1 L9 9 M9 1 L1 9" stroke="currentColor" stroke-width="1.2" fill="none"/>
622
+ </svg>
623
+ </button>
624
+ </div>
625
+ </div>
626
+
627
+ <!-- Toolbar -->
628
+ <div id="toolbar">
629
+ <div id="mode-controls">
630
+ <button class="mode-button" id="passive-btn">
631
+ <span class="indicator"></span>Passive
632
+ </button>
633
+ <button class="mode-button" id="selection-btn">
634
+ <span class="indicator"></span>Selection
635
+ </button>
636
+ </div>
637
+ <div id="action-controls">
638
+ <button class="action-button capture" id="capture-btn" title="Capture Screen Region">
639
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
640
+ <rect x="3" y="3" width="18" height="18" rx="2"/>
641
+ <circle cx="12" cy="12" r="3"/>
642
+ </svg>
643
+ </button>
644
+ <button class="action-button" id="settings-btn" title="Settings">
645
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
646
+ <circle cx="12" cy="12" r="3"/>
647
+ <path d="M12 1v4M12 19v4M4.22 4.22l2.83 2.83M16.95 16.95l2.83 2.83M1 12h4M19 12h4M4.22 19.78l2.83-2.83M16.95 7.05l2.83-2.83"/>
648
+ </svg>
649
+ </button>
650
+ </div>
651
+ </div>
652
+
653
+ <!-- AI Provider Bar -->
654
+ <div id="provider-bar">
655
+ <div id="provider-selector">
656
+ <select id="provider-select" title="AI Provider">
657
+ <option value="copilot">Copilot</option>
658
+ <option value="openai">OpenAI</option>
659
+ <option value="anthropic">Anthropic</option>
660
+ <option value="ollama">Ollama</option>
661
+ </select>
662
+ <select id="model-select" title="Model">
663
+ <option value="gpt-4o">GPT-4o</option>
664
+ <option value="gpt-4o-mini">GPT-4o Mini</option>
665
+ <option value="claude-sonnet-4.5">Claude Sonnet 4.5</option>
666
+ <option value="claude-sonnet-4">Claude Sonnet 4</option>
667
+ <option value="claude-opus-4.5">Claude Opus 4.5</option>
668
+ <option value="claude-haiku-4.5">Claude Haiku 4.5</option>
669
+ <option value="o1">o1</option>
670
+ <option value="o1-mini">o1 Mini</option>
671
+ <option value="o3-mini">o3 Mini</option>
672
+ </select>
673
+ </div>
674
+ <div id="provider-status">
675
+ <span id="auth-status" class="status-badge">Not Connected</span>
676
+ <span id="token-count" class="token-badge" title="Estimated tokens">0 tokens</span>
677
+ </div>
678
+ </div>
679
+
680
+ <!-- Chat history -->
681
+ <div id="chat-history">
682
+ <div class="empty-state">
683
+ <div class="logo">
684
+ <svg viewBox="0 0 24 24"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>
685
+ </div>
686
+ <h2>Copilot Agent</h2>
687
+ <p>Click "Selection" to interact with screen elements, or type a command below.</p>
688
+ <div class="shortcuts">
689
+ <div class="shortcut"><kbd>Ctrl+Alt+Space</kbd> Toggle chat</div>
690
+ <div class="shortcut"><kbd>Ctrl+Shift+O</kbd> Toggle overlay</div>
691
+ <div class="shortcut"><kbd>Ctrl+Alt+F</kbd> Toggle fine dots</div>
692
+ </div>
693
+ </div>
694
+ </div>
695
+
696
+ <!-- Context panel (for selected dots/captures) -->
697
+ <div id="context-panel">
698
+ <div id="context-header">
699
+ <h3>Context <span class="count" id="context-count">0</span></h3>
700
+ <span id="context-toggle">▼</span>
701
+ </div>
702
+ <div id="context-content"></div>
703
+ </div>
704
+
705
+ <!-- Input area -->
706
+ <div id="input-area">
707
+ <div id="input-wrapper">
708
+ <textarea id="message-input" placeholder="Type a command..." rows="1"></textarea>
709
+ <button id="send-button" title="Send message">
710
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
711
+ <path d="M22 2L11 13M22 2L15 22L11 13L2 9L22 2Z"/>
712
+ </svg>
713
+ </button>
714
+ </div>
715
+ </div>
716
+
717
+ <!-- Keyboard hints -->
718
+ <div id="keyboard-hints">
719
+ <span class="hint"><kbd>Enter</kbd> Send</span>
720
+ <span class="hint"><kbd>Shift+Enter</kbd> New line</span>
721
+ </div>
722
+
723
+ <script src="./chat.js"></script>
724
+ </body>
725
+ </html>