neoagent 1.6.0 → 2.0.0

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 (62) hide show
  1. package/README.md +18 -4
  2. package/docs/configuration.md +2 -2
  3. package/docs/skills.md +1 -1
  4. package/lib/manager.js +64 -2
  5. package/package.json +9 -2
  6. package/server/config/origins.js +34 -0
  7. package/server/db/database.js +0 -13
  8. package/server/http/errors.js +17 -0
  9. package/server/http/middleware.js +81 -0
  10. package/server/http/routes.js +45 -0
  11. package/server/http/socket.js +23 -0
  12. package/server/http/static.js +50 -0
  13. package/server/index.js +50 -188
  14. package/server/public/.last_build_id +1 -0
  15. package/server/public/assets/AssetManifest.bin +1 -0
  16. package/server/public/assets/AssetManifest.bin.json +1 -0
  17. package/server/public/assets/AssetManifest.json +1 -0
  18. package/server/public/assets/FontManifest.json +1 -0
  19. package/server/public/assets/NOTICES +33454 -0
  20. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  21. package/server/public/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf +0 -0
  22. package/server/public/assets/shaders/ink_sparkle.frag +126 -0
  23. package/server/public/assets/web/icons/Icon-192.png +0 -0
  24. package/server/public/canvaskit/canvaskit.js +192 -0
  25. package/server/public/canvaskit/canvaskit.js.symbols +12142 -0
  26. package/server/public/canvaskit/canvaskit.wasm +0 -0
  27. package/server/public/canvaskit/chromium/canvaskit.js +192 -0
  28. package/server/public/canvaskit/chromium/canvaskit.js.symbols +11106 -0
  29. package/server/public/canvaskit/chromium/canvaskit.wasm +0 -0
  30. package/server/public/canvaskit/skwasm.js +140 -0
  31. package/server/public/canvaskit/skwasm.js.symbols +12164 -0
  32. package/server/public/canvaskit/skwasm.wasm +0 -0
  33. package/server/public/canvaskit/skwasm_heavy.js +140 -0
  34. package/server/public/canvaskit/skwasm_heavy.js.symbols +13766 -0
  35. package/server/public/canvaskit/skwasm_heavy.wasm +0 -0
  36. package/server/public/favicon.png +0 -0
  37. package/server/public/flutter.js +32 -0
  38. package/server/public/flutter_bootstrap.js +43 -0
  39. package/server/public/flutter_service_worker.js +208 -0
  40. package/server/public/icons/Icon-192.png +0 -0
  41. package/server/public/icons/Icon-512.png +0 -0
  42. package/server/public/icons/Icon-maskable-192.png +0 -0
  43. package/server/public/icons/Icon-maskable-512.png +0 -0
  44. package/server/public/index.html +38 -0
  45. package/server/public/main.dart.js +103124 -0
  46. package/server/public/manifest.json +35 -0
  47. package/server/public/version.json +1 -0
  48. package/server/services/ai/models.js +2 -8
  49. package/server/services/ai/tools.js +0 -47
  50. package/server/services/browser/controller.js +34 -0
  51. package/server/services/manager.js +49 -118
  52. package/server/services/messaging/automation.js +210 -0
  53. package/server/utils/version.js +37 -0
  54. package/server/public/app.html +0 -682
  55. package/server/public/assets/world-office-dark.png +0 -0
  56. package/server/public/assets/world-office-light.png +0 -0
  57. package/server/public/css/app.css +0 -941
  58. package/server/public/css/styles.css +0 -963
  59. package/server/public/favicon.svg +0 -17
  60. package/server/public/js/app.js +0 -4105
  61. package/server/public/login.html +0 -313
  62. package/server/routes/protocols.js +0 -87
@@ -1,941 +0,0 @@
1
- /* ══════════════════════════════════════════
2
- NeoAgent · App Layout · v2
3
- ══════════════════════════════════════════ */
4
-
5
- #app {
6
- display: flex;
7
- height: 100vh;
8
- overflow: hidden;
9
- }
10
-
11
- /* ── SIDEBAR ── */
12
-
13
- .sidebar {
14
- width: var(--sidebar-width);
15
- background: var(--bg-1);
16
- border-right: 1px solid var(--border);
17
- display: flex;
18
- flex-direction: column;
19
- flex-shrink: 0;
20
- overflow: hidden;
21
- }
22
-
23
- .sidebar-header {
24
- display: flex;
25
- align-items: center;
26
- padding: 16px 14px 14px;
27
- border-bottom: 1px solid var(--border);
28
- flex-shrink: 0;
29
- }
30
-
31
- .sidebar-logo {
32
- display: flex;
33
- align-items: center;
34
- gap: 10px;
35
- }
36
-
37
- .logo-icon-sm {
38
- width: 30px;
39
- height: 30px;
40
- background: linear-gradient(135deg, var(--accent), #8b5cf6);
41
- border-radius: 8px;
42
- display: flex;
43
- align-items: center;
44
- justify-content: center;
45
- box-shadow: 0 2px 12px rgba(99, 102, 241, .4);
46
- flex-shrink: 0;
47
- }
48
-
49
- .logo-icon-sm svg {
50
- width: 16px;
51
- height: 16px;
52
- stroke: white;
53
- }
54
-
55
- .logo-text {
56
- font-weight: 700;
57
- font-size: 15px;
58
- background: linear-gradient(135deg, var(--text-primary), var(--text-secondary));
59
- -webkit-background-clip: text;
60
- -webkit-text-fill-color: transparent;
61
- background-clip: text;
62
- }
63
-
64
- /* main nav fills available space */
65
- .sidebar-nav {
66
- flex: 1;
67
- overflow-y: auto;
68
- padding: 8px;
69
- display: flex;
70
- flex-direction: column;
71
- gap: 1px;
72
- }
73
-
74
- .sidebar-section {
75
- flex: 1;
76
- overflow-y: auto;
77
- padding: 10px 8px;
78
- }
79
-
80
- .sidebar-label {
81
- font-size: 11px;
82
- font-weight: 600;
83
- text-transform: uppercase;
84
- letter-spacing: 0.5px;
85
- color: var(--text-muted);
86
- padding: 0 8px;
87
- margin-bottom: 8px;
88
- }
89
-
90
- .chat-history-item {
91
- display: flex;
92
- align-items: center;
93
- gap: 8px;
94
- padding: 8px 12px;
95
- border-radius: var(--radius);
96
- cursor: pointer;
97
- color: var(--text-secondary);
98
- font-size: 13px;
99
- transition: all var(--transition);
100
- overflow: hidden;
101
- }
102
-
103
- .chat-history-item:hover {
104
- background: var(--bg-hover);
105
- color: var(--text-primary);
106
- }
107
-
108
- .chat-history-item.active {
109
- background: var(--accent-muted);
110
- color: var(--accent);
111
- }
112
-
113
- .chat-history-item .chat-title {
114
- overflow: hidden;
115
- text-overflow: ellipsis;
116
- white-space: nowrap;
117
- flex: 1;
118
- }
119
-
120
- .sidebar-footer {
121
- border-top: 1px solid var(--border);
122
- padding: 8px;
123
- flex-shrink: 0;
124
- }
125
-
126
- .sidebar-btn {
127
- display: flex;
128
- align-items: center;
129
- gap: 10px;
130
- width: 100%;
131
- padding: 8px 10px;
132
- border: none;
133
- background: transparent;
134
- color: var(--text-secondary);
135
- border-radius: var(--radius);
136
- cursor: pointer;
137
- font-size: 13px;
138
- font-weight: 500;
139
- transition: background var(--t-fast), color var(--t-fast), transform var(--t-fast);
140
- text-align: left;
141
- position: relative;
142
- }
143
-
144
- .sidebar-btn svg {
145
- flex-shrink: 0;
146
- }
147
-
148
- .sidebar-btn:hover {
149
- background: rgba(255, 255, 255, .05);
150
- color: var(--text-primary);
151
- transform: translateX(2px);
152
- }
153
-
154
- .sidebar-btn.active {
155
- background: var(--accent-muted);
156
- color: var(--accent);
157
- }
158
-
159
- .sidebar-btn.active::before {
160
- content: '';
161
- position: absolute;
162
- left: 0;
163
- top: 22%;
164
- bottom: 22%;
165
- width: 3px;
166
- border-radius: 0 3px 3px 0;
167
- background: var(--accent);
168
- box-shadow: 0 0 8px var(--accent-glow);
169
- }
170
-
171
-
172
- .sidebar-divider {
173
- height: 1px;
174
- background: var(--border);
175
- margin: 4px 0;
176
- }
177
-
178
- /* ── MAIN CONTENT ── */
179
-
180
- .main-content {
181
- flex: 1;
182
- overflow: hidden;
183
- display: flex;
184
- flex-direction: column;
185
- background: var(--bg-0);
186
- }
187
-
188
- .page {
189
- display: none;
190
- flex: 1;
191
- overflow: hidden;
192
- flex-direction: column;
193
- }
194
-
195
- .page.active {
196
- display: flex;
197
- animation: pageFadeIn var(--t-mid, 200ms) cubic-bezier(.16, 1, .3, 1) both;
198
- }
199
-
200
- @keyframes pageFadeIn {
201
- from {
202
- opacity: 0;
203
- transform: translateY(6px);
204
- }
205
-
206
- to {
207
- opacity: 1;
208
- transform: translateY(0);
209
- }
210
- }
211
-
212
- .page-header {
213
- display: flex;
214
- align-items: center;
215
- justify-content: space-between;
216
- padding: 16px 24px;
217
- border-bottom: 1px solid var(--border);
218
- flex-shrink: 0;
219
- background: var(--bg-0);
220
- }
221
-
222
- .page-header h1 {
223
- font-size: 18px;
224
- font-weight: 600;
225
- letter-spacing: -.2px;
226
- }
227
-
228
- .page-body {
229
- flex: 1;
230
- overflow-y: auto;
231
- padding: 24px;
232
- }
233
-
234
- /* ── Chat ── */
235
-
236
- .chat-container {
237
- display: flex;
238
- flex-direction: column;
239
- height: 100%;
240
- }
241
-
242
- .world-badge {
243
- margin-left: auto;
244
- width: 7px;
245
- height: 7px;
246
- border-radius: 50%;
247
- background: var(--accent);
248
- animation: pulse 1.5s ease-in-out infinite;
249
- flex-shrink: 0;
250
- box-shadow: 0 0 6px var(--accent-glow, rgba(99, 102, 241, .4));
251
- }
252
-
253
- .world-badge.hidden {
254
- display: none;
255
- }
256
-
257
- /* ── World UI ── */
258
-
259
- .world-page {
260
- height: 100%;
261
- overflow: auto;
262
- padding: 24px;
263
- background:
264
- linear-gradient(180deg, color-mix(in srgb, var(--bg-1) 86%, white 14%), var(--bg-0)),
265
- radial-gradient(circle at 20% 0%, color-mix(in srgb, var(--accent) 10%, transparent) 0%, transparent 35%);
266
- }
267
-
268
- .world-pill {
269
- display: inline-flex;
270
- align-items: center;
271
- min-height: 34px;
272
- padding: 0 12px;
273
- border-radius: 999px;
274
- border: 1px solid color-mix(in srgb, var(--accent) 20%, var(--border));
275
- background: color-mix(in srgb, var(--bg-0) 68%, transparent);
276
- color: var(--text-primary);
277
- font-size: 12px;
278
- font-weight: 700;
279
- letter-spacing: 0.04em;
280
- text-transform: uppercase;
281
- backdrop-filter: blur(10px);
282
- }
283
-
284
- .world-pill.subtle {
285
- border-color: color-mix(in srgb, var(--info) 18%, var(--border));
286
- color: var(--text-secondary);
287
- }
288
-
289
- .world-layout {
290
- display: grid;
291
- grid-template-columns: minmax(0, 1.9fr) minmax(310px, 0.85fr);
292
- gap: 20px;
293
- min-height: 0;
294
- align-items: start;
295
- }
296
-
297
- .world-stage-card,
298
- .world-panel {
299
- background: color-mix(in srgb, var(--bg-card) 90%, transparent);
300
- border: 1px solid var(--border);
301
- border-radius: 24px;
302
- box-shadow: var(--shadow);
303
- }
304
-
305
- .world-stage-card {
306
- padding: 14px;
307
- min-width: 0;
308
- overflow: hidden;
309
- }
310
-
311
- .world-stage-frame {
312
- position: relative;
313
- border-radius: 20px;
314
- overflow: hidden;
315
- background: var(--bg-1);
316
- border: 1px solid var(--border);
317
- min-height: 560px;
318
- aspect-ratio: 16 / 9;
319
- width: 100%;
320
- max-width: 100%;
321
- }
322
-
323
- .world-canvas {
324
- display: block;
325
- width: 100%;
326
- height: 100%;
327
- min-height: 560px;
328
- max-width: 100%;
329
- image-rendering: pixelated;
330
- image-rendering: crisp-edges;
331
- }
332
-
333
- .world-stage-overlay {
334
- position: absolute;
335
- left: 16px;
336
- right: 16px;
337
- top: 16px;
338
- display: flex;
339
- justify-content: space-between;
340
- align-items: flex-start;
341
- gap: 12px;
342
- pointer-events: none;
343
- }
344
-
345
- .world-overlay-group {
346
- display: flex;
347
- gap: 10px;
348
- flex-wrap: wrap;
349
- }
350
-
351
- .world-overlay-chip {
352
- display: flex;
353
- flex-direction: column;
354
- gap: 3px;
355
- min-width: 0;
356
- padding: 10px 12px;
357
- border-radius: 16px;
358
- background: color-mix(in srgb, var(--bg-0) 78%, transparent);
359
- border: 1px solid var(--border);
360
- backdrop-filter: blur(10px);
361
- }
362
-
363
- .world-overlay-label {
364
- font-size: 10px;
365
- letter-spacing: 0.14em;
366
- text-transform: uppercase;
367
- color: var(--text-muted);
368
- }
369
-
370
- .world-overlay-value {
371
- color: var(--text-primary);
372
- font-size: 13px;
373
- font-weight: 600;
374
- max-width: 320px;
375
- white-space: nowrap;
376
- overflow: hidden;
377
- text-overflow: ellipsis;
378
- }
379
-
380
- .world-hud {
381
- display: flex;
382
- flex-direction: column;
383
- gap: 16px;
384
- min-width: 0;
385
- }
386
-
387
- .world-panel {
388
- padding: 18px;
389
- }
390
-
391
- .world-panel-header {
392
- display: flex;
393
- align-items: center;
394
- justify-content: space-between;
395
- gap: 10px;
396
- margin-bottom: 14px;
397
- }
398
-
399
- .world-panel-header h2 {
400
- margin: 0;
401
- font-size: 15px;
402
- color: var(--text-primary);
403
- }
404
-
405
- .world-panel-kicker {
406
- font-size: 11px;
407
- color: var(--text-muted);
408
- text-transform: uppercase;
409
- letter-spacing: 0.08em;
410
- }
411
-
412
- .world-stats-grid {
413
- display: grid;
414
- grid-template-columns: repeat(2, minmax(0, 1fr));
415
- gap: 10px;
416
- }
417
-
418
- .world-stat {
419
- padding: 12px;
420
- border-radius: 16px;
421
- background: color-mix(in srgb, var(--bg-1) 72%, transparent);
422
- border: 1px solid var(--border);
423
- }
424
-
425
- .world-stat-label {
426
- display: block;
427
- margin-bottom: 6px;
428
- font-size: 11px;
429
- color: var(--text-muted);
430
- text-transform: uppercase;
431
- letter-spacing: 0.08em;
432
- }
433
-
434
- .world-stat-value {
435
- display: block;
436
- color: var(--text-primary);
437
- font-size: 18px;
438
- line-height: 1.2;
439
- }
440
-
441
- .world-event-list {
442
- display: flex;
443
- flex-direction: column;
444
- gap: 10px;
445
- }
446
-
447
- .world-agent-list {
448
- display: flex;
449
- flex-direction: column;
450
- gap: 10px;
451
- }
452
-
453
- .world-agent-card {
454
- padding: 12px 13px;
455
- border-radius: 16px;
456
- background: color-mix(in srgb, var(--bg-1) 72%, transparent);
457
- border: 1px solid var(--border);
458
- }
459
-
460
- .world-agent-topline {
461
- display: flex;
462
- align-items: center;
463
- justify-content: space-between;
464
- gap: 10px;
465
- margin-bottom: 8px;
466
- }
467
-
468
- .world-agent-title {
469
- color: var(--text-primary);
470
- font-size: 14px;
471
- font-weight: 700;
472
- }
473
-
474
- .world-agent-chip {
475
- display: inline-flex;
476
- align-items: center;
477
- justify-content: center;
478
- min-height: 22px;
479
- padding: 0 8px;
480
- border-radius: 999px;
481
- font-size: 10px;
482
- letter-spacing: 0.08em;
483
- text-transform: uppercase;
484
- font-weight: 800;
485
- }
486
-
487
- .world-agent-chip.lead {
488
- background: color-mix(in srgb, var(--success) 16%, transparent);
489
- color: var(--success);
490
- }
491
-
492
- .world-agent-chip.helper {
493
- background: color-mix(in srgb, var(--info) 16%, transparent);
494
- color: var(--info);
495
- }
496
-
497
- .world-agent-meta {
498
- color: var(--text-secondary);
499
- font-size: 12px;
500
- margin-bottom: 6px;
501
- }
502
-
503
- .world-agent-status {
504
- color: var(--text-primary);
505
- font-size: 13px;
506
- line-height: 1.5;
507
- }
508
-
509
- .world-event-entry,
510
- .world-empty-state {
511
- padding: 12px 13px;
512
- border-radius: 16px;
513
- background: color-mix(in srgb, var(--bg-1) 72%, transparent);
514
- border: 1px solid var(--border);
515
- }
516
-
517
- .world-empty-state {
518
- color: var(--text-secondary);
519
- line-height: 1.6;
520
- }
521
-
522
- .world-event-topline {
523
- display: flex;
524
- align-items: center;
525
- justify-content: space-between;
526
- gap: 10px;
527
- margin-bottom: 6px;
528
- }
529
-
530
- .world-event-tag {
531
- font-size: 10px;
532
- font-weight: 800;
533
- letter-spacing: 0.12em;
534
- text-transform: uppercase;
535
- color: var(--accent);
536
- }
537
-
538
- .world-event-time {
539
- font-size: 11px;
540
- color: var(--text-muted);
541
- }
542
-
543
- .world-event-text {
544
- color: var(--text-primary);
545
- font-size: 13px;
546
- line-height: 1.5;
547
- }
548
-
549
- .world-legend {
550
- display: grid;
551
- grid-template-columns: repeat(2, minmax(0, 1fr));
552
- gap: 10px;
553
- }
554
-
555
- .world-legend-item {
556
- display: flex;
557
- align-items: center;
558
- gap: 10px;
559
- color: var(--text-primary);
560
- font-size: 13px;
561
- }
562
-
563
- .swatch {
564
- width: 14px;
565
- height: 14px;
566
- border-radius: 4px;
567
- box-shadow: 0 0 10px currentColor;
568
- }
569
-
570
- .swatch.core {
571
- background: var(--success);
572
- color: var(--success);
573
- }
574
-
575
- .swatch.browser {
576
- background: var(--info);
577
- color: var(--info);
578
- }
579
-
580
- .swatch.memory {
581
- background: var(--warning);
582
- color: var(--warning);
583
- }
584
-
585
- .swatch.cli {
586
- background: #f97316;
587
- color: #f97316;
588
- }
589
-
590
- .swatch.social {
591
- background: #ec4899;
592
- color: #ec4899;
593
- }
594
-
595
- /* ── Chat: social message bubble ── */
596
- .chat-message.social .chat-avatar {
597
- background: #25d36620;
598
- color: #25d366;
599
- font-size: 12px;
600
- }
601
-
602
- .chat-message.social .chat-bubble {
603
- background: var(--bg-card);
604
- border: 1px solid var(--border);
605
- border-bottom-left-radius: 4px;
606
- }
607
-
608
- .chat-platform-badge {
609
- display: inline-flex;
610
- align-items: center;
611
- gap: 4px;
612
- font-size: 10px;
613
- font-weight: 700;
614
- text-transform: uppercase;
615
- letter-spacing: 0.5px;
616
- color: var(--text-muted);
617
- margin-bottom: 4px;
618
- }
619
-
620
- .chat-platform-badge.whatsapp {
621
- color: #25d366;
622
- }
623
-
624
- .chat-sender {
625
- font-size: 12px;
626
- font-weight: 600;
627
- color: var(--text-secondary);
628
- margin-bottom: 4px;
629
- }
630
-
631
- /* ── Chat: interim status message ── */
632
- .chat-interim {
633
- display: flex;
634
- align-items: flex-start;
635
- gap: 8px;
636
- margin-bottom: 8px;
637
- padding-left: 4px;
638
- }
639
-
640
- .chat-interim-dot {
641
- width: 6px;
642
- height: 6px;
643
- border-radius: 50%;
644
- background: var(--accent);
645
- flex-shrink: 0;
646
- margin-top: 6px;
647
- animation: pulse 1.2s ease-in-out infinite;
648
- }
649
-
650
- .chat-interim-text {
651
- font-size: 13px;
652
- color: var(--text-muted);
653
- font-style: italic;
654
- line-height: 1.5;
655
- }
656
-
657
- .chat-messages {
658
- flex: 1;
659
- overflow-y: auto;
660
- padding: 24px 24px 12px;
661
- }
662
-
663
- .chat-message {
664
- display: flex;
665
- gap: 12px;
666
- margin-bottom: 20px;
667
- max-width: 820px;
668
- animation: msgIn 200ms cubic-bezier(.16, 1, .3, 1) both;
669
- }
670
-
671
- @keyframes msgIn {
672
- from {
673
- opacity: 0;
674
- transform: translateY(6px);
675
- }
676
-
677
- to {
678
- opacity: 1;
679
- transform: translateY(0);
680
- }
681
- }
682
-
683
- .chat-message.user {
684
- flex-direction: row-reverse;
685
- margin-left: auto;
686
- }
687
-
688
- .chat-avatar {
689
- width: 30px;
690
- height: 30px;
691
- border-radius: 8px;
692
- display: flex;
693
- align-items: center;
694
- justify-content: center;
695
- flex-shrink: 0;
696
- font-size: 13px;
697
- font-weight: 600;
698
- }
699
-
700
- .chat-message.assistant .chat-avatar {
701
- background: linear-gradient(135deg, var(--accent), #8b5cf6);
702
- color: white;
703
- box-shadow: 0 2px 10px rgba(99, 102, 241, .35);
704
- }
705
-
706
- .chat-message.user .chat-avatar {
707
- background: var(--bg-4, #1e1e32);
708
- color: var(--text-secondary);
709
- }
710
-
711
- .chat-bubble {
712
- padding: 11px 16px;
713
- border-radius: var(--radius-lg);
714
- max-width: 620px;
715
- line-height: 1.65;
716
- word-break: break-word;
717
- }
718
-
719
- .chat-message.user .chat-bubble {
720
- background: var(--accent);
721
- color: #fff;
722
- border-bottom-right-radius: 4px;
723
- box-shadow: 0 2px 12px rgba(99, 102, 241, .3);
724
- }
725
-
726
- .chat-message.assistant .chat-bubble {
727
- background: var(--bg-card);
728
- border: 1px solid var(--border);
729
- border-bottom-left-radius: 4px;
730
- }
731
-
732
- .chat-tool-call {
733
- background: var(--bg-primary);
734
- border: 1px solid var(--border);
735
- border-radius: var(--radius);
736
- padding: 10px 14px;
737
- margin: 8px 0;
738
- font-size: 12px;
739
- }
740
-
741
- .chat-tool-call .tool-name {
742
- color: var(--accent);
743
- font-weight: 600;
744
- font-family: 'SF Mono', monospace;
745
- }
746
-
747
- .chat-tool-call .tool-result {
748
- color: var(--text-secondary);
749
- margin-top: 6px;
750
- font-family: 'SF Mono', monospace;
751
- white-space: pre-wrap;
752
- max-height: 200px;
753
- overflow-y: auto;
754
- }
755
-
756
- .chat-thinking {
757
- display: flex;
758
- align-items: center;
759
- gap: 8px;
760
- padding: 12px 16px;
761
- color: var(--text-muted);
762
- font-size: 13px;
763
- }
764
-
765
- .chat-thinking .spinner {
766
- width: 16px;
767
- height: 16px;
768
- }
769
-
770
- /* ── Animations ── */
771
-
772
- @keyframes pulse {
773
-
774
- 0%,
775
- 100% {
776
- opacity: 1;
777
- }
778
-
779
- 50% {
780
- opacity: 0.3;
781
- }
782
- }
783
-
784
- /* ── CHAT INPUT ── */
785
-
786
- .chat-input-area {
787
- padding: 12px 20px 20px;
788
- border-top: 1px solid var(--border);
789
- flex-shrink: 0;
790
- }
791
-
792
- .chat-input-wrapper {
793
- display: flex;
794
- align-items: flex-end;
795
- gap: 8px;
796
- background: var(--bg-2);
797
- border: 1px solid var(--border);
798
- border-radius: var(--radius-lg);
799
- padding: 4px 4px 4px 16px;
800
- transition: border-color 120ms ease, box-shadow 120ms ease;
801
- }
802
-
803
- .chat-input-wrapper:focus-within {
804
- border-color: var(--accent);
805
- box-shadow: 0 0 0 3px var(--accent-muted), 0 4px 20px rgba(99, 102, 241, .12);
806
- }
807
-
808
- .chat-input {
809
- flex: 1;
810
- border: none;
811
- background: transparent;
812
- resize: none;
813
- padding: 10px 0;
814
- max-height: 200px;
815
- line-height: 1.5;
816
- color: var(--text-primary);
817
- }
818
-
819
- .chat-input:focus {
820
- outline: none;
821
- }
822
-
823
- .chat-send-btn {
824
- border-radius: 10px;
825
- padding: 8px 12px;
826
- flex-shrink: 0;
827
- transition: transform 120ms ease, box-shadow 120ms ease, background 120ms ease;
828
- }
829
-
830
- .chat-send-btn:hover {
831
- transform: scale(1.06);
832
- }
833
-
834
- .chat-input-info {
835
- display: flex;
836
- justify-content: space-between;
837
- padding: 5px 2px 0;
838
- }
839
-
840
- /* ── MEMORY PANELS ── */
841
-
842
- .mem-panel {
843
- display: none;
844
- }
845
-
846
- .mem-panel.active {
847
- display: block;
848
- animation: pageFadeIn 200ms cubic-bezier(.16, 1, .3, 1) both;
849
- }
850
-
851
- /* ── MCP / Skill / Task Cards ── */
852
-
853
- .item-card {
854
- background: var(--bg-card);
855
- border: 1px solid var(--border);
856
- border-radius: var(--radius-lg);
857
- padding: 16px;
858
- margin-bottom: 10px;
859
- transition: border-color 120ms ease, box-shadow 120ms ease;
860
- animation: fadeSlideUp 200ms cubic-bezier(.16, 1, .3, 1) both;
861
- }
862
-
863
- .item-card:hover {
864
- border-color: var(--border-light);
865
- box-shadow: 0 2px 12px rgba(0, 0, 0, .3);
866
- }
867
-
868
- .item-card-header {
869
- display: flex;
870
- align-items: center;
871
- justify-content: space-between;
872
- margin-bottom: 8px;
873
- }
874
-
875
- .item-card-title {
876
- font-weight: 600;
877
- font-size: 14px;
878
- }
879
-
880
- .item-card-meta {
881
- font-size: 12px;
882
- color: var(--text-secondary);
883
- }
884
-
885
- .item-card-actions {
886
- display: flex;
887
- gap: 6px;
888
- }
889
-
890
- /* ── QR Code ── */
891
-
892
- #qrContainer canvas,
893
- #qrContainer img {
894
- border-radius: var(--radius);
895
- max-width: 280px;
896
- }
897
-
898
- /* ── Responsive ── */
899
-
900
- @media (max-width: 768px) {
901
- .sidebar {
902
- width: 0;
903
- position: absolute;
904
- z-index: 100;
905
- height: 100%;
906
- }
907
-
908
- .sidebar.open {
909
- width: var(--sidebar-width);
910
- }
911
-
912
- .chat-message {
913
- max-width: 100%;
914
- }
915
-
916
- .world-page {
917
- padding: 18px;
918
- }
919
-
920
- .world-layout {
921
- grid-template-columns: 1fr;
922
- }
923
-
924
- .world-stage-frame,
925
- .world-canvas {
926
- min-height: 380px;
927
- }
928
-
929
- .world-stage-overlay {
930
- flex-direction: column;
931
- align-items: flex-start;
932
- }
933
-
934
- .world-overlay-group {
935
- width: 100%;
936
- }
937
-
938
- .world-legend {
939
- grid-template-columns: 1fr;
940
- }
941
- }