tryassay 0.21.1 → 0.22.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 (37) hide show
  1. package/README.md +4 -4
  2. package/demo/.claude/.truth_last_prompt +1 -0
  3. package/demo/.claude/truth_status +1 -0
  4. package/demo/css/style.css +1181 -0
  5. package/demo/data/demo-events.json +103 -0
  6. package/demo/index.html +222 -0
  7. package/demo/js/chat.js +292 -0
  8. package/demo/js/code-panel.js +206 -0
  9. package/demo/js/demo-mode.js +107 -0
  10. package/demo/js/orb.js +634 -0
  11. package/demo/js/question-cards.js +207 -0
  12. package/demo/js/sse-client.js +473 -0
  13. package/demo/js/state.js +162 -0
  14. package/demo/js/timeline.js +394 -0
  15. package/demo/js/voice.js +154 -0
  16. package/dist/api/server.d.ts +1 -0
  17. package/dist/api/server.js +65 -2
  18. package/dist/api/server.js.map +1 -1
  19. package/dist/cli.js +13 -0
  20. package/dist/cli.js.map +1 -1
  21. package/dist/commands/demo.d.ts +5 -0
  22. package/dist/commands/demo.js +107 -0
  23. package/dist/commands/demo.js.map +1 -0
  24. package/dist/commands/runtime.d.ts +4 -0
  25. package/dist/commands/runtime.js +50 -3
  26. package/dist/commands/runtime.js.map +1 -1
  27. package/dist/runtime/agents/planner-agent.d.ts +5 -2
  28. package/dist/runtime/agents/planner-agent.js +232 -1
  29. package/dist/runtime/agents/planner-agent.js.map +1 -1
  30. package/dist/runtime/app-create-orchestrator.d.ts +4 -0
  31. package/dist/runtime/app-create-orchestrator.js +151 -48
  32. package/dist/runtime/app-create-orchestrator.js.map +1 -1
  33. package/dist/runtime/dashboard-sync.d.ts +25 -0
  34. package/dist/runtime/dashboard-sync.js +169 -0
  35. package/dist/runtime/dashboard-sync.js.map +1 -0
  36. package/dist/runtime/types.d.ts +28 -0
  37. package/package.json +3 -2
@@ -0,0 +1,1181 @@
1
+ /* style.css — Dark theme, grid layout, animations */
2
+
3
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Inter:wght@300;400;500;600;700&display=swap');
4
+
5
+ * {
6
+ margin: 0;
7
+ padding: 0;
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ :root {
12
+ --bg: #0a0a0a;
13
+ --bg-panel: rgba(15, 15, 25, 0.85);
14
+ --bg-glass: rgba(20, 20, 40, 0.6);
15
+ --border: rgba(255, 255, 255, 0.06);
16
+ --border-glow: rgba(255, 255, 255, 0.12);
17
+ --text: #e0e0e0;
18
+ --text-dim: #6b7280;
19
+ --text-bright: #ffffff;
20
+ --accent-blue: #1e3a5f;
21
+ --accent-cyan: #06b6d4;
22
+ --accent-amber: #f59e0b;
23
+ --accent-green: #22c55e;
24
+ --accent-red: #ef4444;
25
+ --accent-white: #ffffff;
26
+ --font-mono: 'JetBrains Mono', monospace;
27
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
28
+ }
29
+
30
+ html, body {
31
+ width: 100%;
32
+ height: 100%;
33
+ overflow: hidden;
34
+ background: var(--bg);
35
+ color: var(--text);
36
+ font-family: var(--font-sans);
37
+ }
38
+
39
+ /* === Layout Grid === */
40
+ #app {
41
+ display: grid;
42
+ grid-template-columns: 1fr 420px;
43
+ grid-template-rows: 60px 1fr 200px;
44
+ width: 100%;
45
+ height: 100%;
46
+ gap: 1px;
47
+ }
48
+
49
+ #header {
50
+ grid-column: 1 / -1;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ padding: 0 24px;
55
+ position: relative;
56
+ z-index: 10;
57
+ }
58
+
59
+ #orb-container {
60
+ grid-column: 1;
61
+ grid-row: 2;
62
+ position: relative;
63
+ overflow: hidden;
64
+ }
65
+
66
+ #timeline-panel {
67
+ grid-column: 2;
68
+ grid-row: 2 / 4;
69
+ background: var(--bg-panel);
70
+ border-left: 1px solid var(--border);
71
+ overflow-y: auto;
72
+ padding: 16px;
73
+ display: flex;
74
+ flex-direction: column;
75
+ }
76
+
77
+ #code-panel {
78
+ grid-column: 1;
79
+ grid-row: 3;
80
+ background: var(--bg-panel);
81
+ border-top: 1px solid var(--border);
82
+ overflow: hidden;
83
+ opacity: 0.3;
84
+ transition: opacity 0.5s ease;
85
+ }
86
+
87
+ #code-panel.active {
88
+ opacity: 1;
89
+ }
90
+
91
+ /* === Header / Input Bar === */
92
+ #input-bar {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: 12px;
96
+ width: 100%;
97
+ max-width: 700px;
98
+ }
99
+
100
+ #input-bar input {
101
+ flex: 1;
102
+ background: var(--bg-glass);
103
+ border: 1px solid var(--border-glow);
104
+ border-radius: 12px;
105
+ padding: 10px 20px;
106
+ color: var(--text-bright);
107
+ font-family: var(--font-sans);
108
+ font-size: 14px;
109
+ outline: none;
110
+ backdrop-filter: blur(12px);
111
+ transition: border-color 0.3s, box-shadow 0.3s;
112
+ }
113
+
114
+ #input-bar input::placeholder {
115
+ color: var(--text-dim);
116
+ }
117
+
118
+ #input-bar input:focus {
119
+ border-color: var(--accent-cyan);
120
+ box-shadow: 0 0 20px rgba(6, 182, 212, 0.15);
121
+ }
122
+
123
+ #input-bar input:disabled {
124
+ opacity: 0.4;
125
+ cursor: not-allowed;
126
+ }
127
+
128
+ #input-bar button {
129
+ background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
130
+ border: none;
131
+ border-radius: 10px;
132
+ padding: 10px 20px;
133
+ color: #000;
134
+ font-family: var(--font-sans);
135
+ font-weight: 600;
136
+ font-size: 13px;
137
+ cursor: pointer;
138
+ transition: transform 0.15s, opacity 0.2s;
139
+ white-space: nowrap;
140
+ }
141
+
142
+ #input-bar button:hover {
143
+ transform: scale(1.03);
144
+ }
145
+
146
+ #input-bar button:disabled {
147
+ opacity: 0.3;
148
+ cursor: not-allowed;
149
+ transform: none;
150
+ }
151
+
152
+ /* === Global Clock === */
153
+ .global-clock {
154
+ position: absolute;
155
+ right: 80px;
156
+ top: 50%;
157
+ transform: translateY(-50%);
158
+ display: flex;
159
+ flex-direction: column;
160
+ align-items: center;
161
+ gap: 1px;
162
+ transition: opacity 0.4s ease;
163
+ }
164
+
165
+ .global-clock.hidden {
166
+ opacity: 0;
167
+ pointer-events: none;
168
+ }
169
+
170
+ .global-clock .clock-value {
171
+ font-family: var(--font-mono);
172
+ font-size: 22px;
173
+ font-weight: 700;
174
+ color: var(--accent-cyan);
175
+ letter-spacing: 2px;
176
+ text-shadow: 0 0 20px rgba(6, 182, 212, 0.4);
177
+ }
178
+
179
+ .global-clock .clock-label {
180
+ font-size: 9px;
181
+ text-transform: uppercase;
182
+ letter-spacing: 2px;
183
+ color: var(--text-dim);
184
+ }
185
+
186
+ #mute-toggle {
187
+ position: absolute;
188
+ right: 24px;
189
+ top: 50%;
190
+ transform: translateY(-50%);
191
+ background: var(--bg-glass);
192
+ border: 1px solid var(--border);
193
+ border-radius: 8px;
194
+ padding: 6px 10px;
195
+ color: var(--text-dim);
196
+ cursor: pointer;
197
+ font-size: 16px;
198
+ transition: color 0.2s;
199
+ }
200
+
201
+ #mute-toggle:hover {
202
+ color: var(--text);
203
+ }
204
+
205
+ #mute-toggle.muted {
206
+ color: var(--accent-red);
207
+ }
208
+
209
+ /* === Metrics Bar === */
210
+ #metrics-bar {
211
+ display: flex;
212
+ gap: 20px;
213
+ padding: 12px 0;
214
+ border-bottom: 1px solid var(--border);
215
+ margin-bottom: 12px;
216
+ flex-shrink: 0;
217
+ }
218
+
219
+ .metric {
220
+ display: flex;
221
+ flex-direction: column;
222
+ align-items: center;
223
+ gap: 2px;
224
+ }
225
+
226
+ .metric-value {
227
+ font-family: var(--font-mono);
228
+ font-size: 20px;
229
+ font-weight: 700;
230
+ color: var(--text-bright);
231
+ }
232
+
233
+ .metric-label {
234
+ font-size: 10px;
235
+ text-transform: uppercase;
236
+ letter-spacing: 1px;
237
+ color: var(--text-dim);
238
+ }
239
+
240
+ /* === Timeline Steps === */
241
+ #timeline-steps {
242
+ flex: 1;
243
+ overflow-y: auto;
244
+ padding-right: 4px;
245
+ }
246
+
247
+ .timeline-step {
248
+ position: relative;
249
+ padding: 12px 12px 12px 32px;
250
+ margin-bottom: 4px;
251
+ border-radius: 8px;
252
+ transition: background 0.3s, border-color 0.3s;
253
+ border: 1px solid transparent;
254
+ }
255
+
256
+ .timeline-step::before {
257
+ content: '';
258
+ position: absolute;
259
+ left: 12px;
260
+ top: 16px;
261
+ width: 8px;
262
+ height: 8px;
263
+ border-radius: 50%;
264
+ background: var(--text-dim);
265
+ transition: background 0.3s, box-shadow 0.3s;
266
+ }
267
+
268
+ .timeline-step.pending::before {
269
+ background: var(--text-dim);
270
+ }
271
+
272
+ .timeline-step.active {
273
+ background: rgba(6, 182, 212, 0.08);
274
+ border-color: rgba(6, 182, 212, 0.2);
275
+ }
276
+
277
+ .timeline-step.active::before {
278
+ background: var(--accent-cyan);
279
+ box-shadow: 0 0 12px var(--accent-cyan);
280
+ animation: pulse-dot 2s ease-in-out infinite;
281
+ }
282
+
283
+ .timeline-step.completed::before {
284
+ background: var(--accent-green);
285
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.4);
286
+ }
287
+
288
+ .timeline-step.failed::before {
289
+ background: var(--accent-red);
290
+ box-shadow: 0 0 8px rgba(239, 68, 68, 0.4);
291
+ }
292
+
293
+ .step-header {
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: space-between;
297
+ gap: 8px;
298
+ }
299
+
300
+ .step-name {
301
+ font-size: 13px;
302
+ font-weight: 500;
303
+ color: var(--text);
304
+ }
305
+
306
+ .timeline-step.active .step-name {
307
+ color: var(--text-bright);
308
+ }
309
+
310
+ .timeline-step.pending .step-name {
311
+ color: var(--text-dim);
312
+ }
313
+
314
+ /* Phase duration badge (completed phases) */
315
+ .phase-duration {
316
+ font-family: var(--font-mono);
317
+ font-size: 11px;
318
+ font-weight: 500;
319
+ color: var(--accent-green);
320
+ background: rgba(34, 197, 94, 0.1);
321
+ padding: 1px 8px;
322
+ border-radius: 10px;
323
+ border: 1px solid rgba(34, 197, 94, 0.15);
324
+ white-space: nowrap;
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ /* Live elapsed counter (active phase) */
329
+ .phase-elapsed-live {
330
+ font-family: var(--font-mono);
331
+ font-size: 11px;
332
+ font-weight: 500;
333
+ color: var(--accent-cyan);
334
+ background: rgba(6, 182, 212, 0.1);
335
+ padding: 1px 8px;
336
+ border-radius: 10px;
337
+ border: 1px solid rgba(6, 182, 212, 0.15);
338
+ white-space: nowrap;
339
+ flex-shrink: 0;
340
+ animation: pulse-elapsed 2s ease-in-out infinite;
341
+ }
342
+
343
+ @keyframes pulse-elapsed {
344
+ 0%, 100% { opacity: 0.8; }
345
+ 50% { opacity: 1; }
346
+ }
347
+
348
+ /* Heartbeat indicator (shows during silence) */
349
+ .heartbeat-indicator {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 6px;
353
+ font-family: var(--font-mono);
354
+ font-size: 10px;
355
+ color: var(--text-dim);
356
+ padding: 4px 0;
357
+ opacity: 0;
358
+ transition: opacity 0.5s ease;
359
+ height: 0;
360
+ overflow: hidden;
361
+ }
362
+
363
+ .heartbeat-indicator.visible {
364
+ opacity: 1;
365
+ height: auto;
366
+ }
367
+
368
+ .heartbeat-dot {
369
+ display: inline-block;
370
+ width: 6px;
371
+ height: 6px;
372
+ border-radius: 50%;
373
+ background: var(--accent-cyan);
374
+ animation: heartbeat-pulse 1.2s ease-in-out infinite;
375
+ }
376
+
377
+ @keyframes heartbeat-pulse {
378
+ 0%, 100% { transform: scale(1); opacity: 0.4; }
379
+ 25% { transform: scale(1.6); opacity: 1; }
380
+ 35% { transform: scale(0.9); opacity: 0.6; }
381
+ 45% { transform: scale(1.3); opacity: 0.9; }
382
+ 55% { transform: scale(1); opacity: 0.4; }
383
+ }
384
+
385
+ .step-details {
386
+ margin-top: 8px;
387
+ max-height: 0;
388
+ overflow: hidden;
389
+ transition: max-height 0.4s ease;
390
+ }
391
+
392
+ .timeline-step.active .step-details,
393
+ .timeline-step.completed .step-details {
394
+ max-height: 500px;
395
+ }
396
+
397
+ .step-task {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 8px;
401
+ padding: 4px 0;
402
+ font-size: 11px;
403
+ color: var(--text-dim);
404
+ }
405
+
406
+ .step-task .agent-badge {
407
+ background: rgba(6, 182, 212, 0.15);
408
+ color: var(--accent-cyan);
409
+ padding: 1px 6px;
410
+ border-radius: 4px;
411
+ font-family: var(--font-mono);
412
+ font-size: 10px;
413
+ }
414
+
415
+ .verification-item {
416
+ display: flex;
417
+ align-items: flex-start;
418
+ gap: 6px;
419
+ padding: 3px 0;
420
+ font-size: 11px;
421
+ font-family: var(--font-mono);
422
+ }
423
+
424
+ .verification-item.pass {
425
+ color: var(--accent-green);
426
+ }
427
+
428
+ .verification-item.fail {
429
+ color: var(--accent-red);
430
+ }
431
+
432
+ .verification-item .method-badge {
433
+ font-size: 9px;
434
+ padding: 0 4px;
435
+ border-radius: 3px;
436
+ background: rgba(255, 255, 255, 0.06);
437
+ color: var(--text-dim);
438
+ }
439
+
440
+ /* === Code Panel === */
441
+ #code-tabs {
442
+ display: flex;
443
+ gap: 0;
444
+ border-bottom: 1px solid var(--border);
445
+ background: rgba(10, 10, 20, 0.5);
446
+ overflow-x: auto;
447
+ flex-shrink: 0;
448
+ }
449
+
450
+ .code-tab {
451
+ padding: 8px 16px;
452
+ font-family: var(--font-mono);
453
+ font-size: 11px;
454
+ color: var(--text-dim);
455
+ border: none;
456
+ background: none;
457
+ cursor: pointer;
458
+ border-bottom: 2px solid transparent;
459
+ transition: color 0.2s, border-color 0.2s;
460
+ white-space: nowrap;
461
+ }
462
+
463
+ .code-tab:hover {
464
+ color: var(--text);
465
+ }
466
+
467
+ .code-tab.active {
468
+ color: var(--accent-cyan);
469
+ border-bottom-color: var(--accent-cyan);
470
+ }
471
+
472
+ #code-content {
473
+ padding: 12px 16px;
474
+ font-family: var(--font-mono);
475
+ font-size: 12px;
476
+ line-height: 1.6;
477
+ overflow-y: auto;
478
+ height: calc(100% - 36px);
479
+ white-space: pre;
480
+ color: var(--text);
481
+ }
482
+
483
+ /* Syntax highlighting */
484
+ .code-content .keyword { color: #c678dd; }
485
+ .code-content .string { color: #98c379; }
486
+ .code-content .comment { color: #5c6370; font-style: italic; }
487
+ .code-content .number { color: #d19a66; }
488
+ .code-content .function { color: #61afef; }
489
+ .code-content .type { color: #e5c07b; }
490
+ .code-content .operator { color: #56b6c2; }
491
+ .code-content .punctuation { color: #abb2bf; }
492
+
493
+ /* === Plan Overlay === */
494
+ #plan-overlay {
495
+ position: fixed;
496
+ top: 0;
497
+ left: 0;
498
+ width: 100%;
499
+ height: 100%;
500
+ display: flex;
501
+ align-items: center;
502
+ justify-content: center;
503
+ z-index: 100;
504
+ pointer-events: none;
505
+ opacity: 0;
506
+ transition: opacity 0.5s ease;
507
+ }
508
+
509
+ #plan-overlay.visible {
510
+ opacity: 1;
511
+ pointer-events: auto;
512
+ }
513
+
514
+ .plan-card {
515
+ background: rgba(10, 10, 30, 0.95);
516
+ border: 1px solid rgba(6, 182, 212, 0.3);
517
+ border-radius: 16px;
518
+ padding: 32px 40px;
519
+ max-width: 520px;
520
+ width: 90%;
521
+ backdrop-filter: blur(20px);
522
+ box-shadow: 0 0 60px rgba(6, 182, 212, 0.15), 0 0 120px rgba(6, 182, 212, 0.05);
523
+ animation: plan-enter 0.4s ease-out;
524
+ }
525
+
526
+ @keyframes plan-enter {
527
+ from { transform: scale(0.9); opacity: 0; }
528
+ to { transform: scale(1); opacity: 1; }
529
+ }
530
+
531
+ .plan-header {
532
+ font-size: 18px;
533
+ font-weight: 600;
534
+ color: var(--text-bright);
535
+ margin-bottom: 16px;
536
+ letter-spacing: 0.5px;
537
+ }
538
+
539
+ .plan-meta {
540
+ display: flex;
541
+ flex-wrap: wrap;
542
+ gap: 12px;
543
+ margin-bottom: 20px;
544
+ }
545
+
546
+ .plan-meta span {
547
+ font-family: var(--font-mono);
548
+ font-size: 12px;
549
+ color: var(--accent-cyan);
550
+ background: rgba(6, 182, 212, 0.1);
551
+ padding: 4px 10px;
552
+ border-radius: 6px;
553
+ border: 1px solid rgba(6, 182, 212, 0.15);
554
+ }
555
+
556
+ .plan-features {
557
+ display: flex;
558
+ flex-direction: column;
559
+ gap: 8px;
560
+ margin-bottom: 16px;
561
+ }
562
+
563
+ .plan-feature {
564
+ display: flex;
565
+ justify-content: space-between;
566
+ align-items: center;
567
+ padding: 8px 12px;
568
+ background: rgba(255, 255, 255, 0.03);
569
+ border-radius: 8px;
570
+ border: 1px solid var(--border);
571
+ }
572
+
573
+ .plan-feature-name {
574
+ font-size: 13px;
575
+ font-weight: 500;
576
+ color: var(--text);
577
+ }
578
+
579
+ .plan-feature-meta {
580
+ font-family: var(--font-mono);
581
+ font-size: 10px;
582
+ color: var(--text-dim);
583
+ }
584
+
585
+ .plan-warnings {
586
+ margin-bottom: 12px;
587
+ }
588
+
589
+ .plan-warning {
590
+ font-size: 11px;
591
+ color: var(--accent-amber);
592
+ padding: 4px 0;
593
+ }
594
+
595
+ .plan-warning::before {
596
+ content: '\26a0\fe0f ';
597
+ }
598
+
599
+ .plan-auto {
600
+ font-size: 12px;
601
+ color: var(--text-dim);
602
+ text-align: center;
603
+ margin-top: 12px;
604
+ animation: pulse-text 1.5s ease-in-out infinite;
605
+ }
606
+
607
+ @keyframes pulse-text {
608
+ 0%, 100% { opacity: 0.5; }
609
+ 50% { opacity: 1; }
610
+ }
611
+
612
+ /* === Completion Overlay === */
613
+ #completion-overlay {
614
+ position: fixed;
615
+ top: 0;
616
+ left: 0;
617
+ width: 100%;
618
+ height: 100%;
619
+ display: flex;
620
+ align-items: center;
621
+ justify-content: center;
622
+ z-index: 100;
623
+ pointer-events: none;
624
+ opacity: 0;
625
+ transition: opacity 0.5s ease;
626
+ }
627
+
628
+ #completion-overlay.visible {
629
+ opacity: 1;
630
+ pointer-events: auto;
631
+ }
632
+
633
+ .completion-card {
634
+ background: rgba(10, 10, 30, 0.95);
635
+ border: 1px solid rgba(34, 197, 94, 0.3);
636
+ border-radius: 16px;
637
+ padding: 40px 48px;
638
+ max-width: 440px;
639
+ width: 90%;
640
+ backdrop-filter: blur(20px);
641
+ box-shadow: 0 0 60px rgba(34, 197, 94, 0.15), 0 0 120px rgba(34, 197, 94, 0.05);
642
+ animation: plan-enter 0.4s ease-out;
643
+ text-align: center;
644
+ }
645
+
646
+ .completion-icon {
647
+ font-size: 48px;
648
+ margin-bottom: 12px;
649
+ line-height: 1;
650
+ }
651
+
652
+ .completion-icon.success {
653
+ color: var(--accent-green);
654
+ text-shadow: 0 0 30px rgba(34, 197, 94, 0.5);
655
+ }
656
+
657
+ .completion-icon.partial {
658
+ color: var(--accent-amber);
659
+ text-shadow: 0 0 30px rgba(245, 158, 11, 0.5);
660
+ }
661
+
662
+ .completion-header {
663
+ font-size: 20px;
664
+ font-weight: 600;
665
+ color: var(--text-bright);
666
+ margin-bottom: 4px;
667
+ letter-spacing: 0.5px;
668
+ }
669
+
670
+ .completion-app-name {
671
+ font-family: var(--font-mono);
672
+ font-size: 14px;
673
+ color: var(--accent-cyan);
674
+ margin-bottom: 20px;
675
+ }
676
+
677
+ .completion-metrics {
678
+ display: flex;
679
+ justify-content: center;
680
+ gap: 16px;
681
+ margin-bottom: 24px;
682
+ }
683
+
684
+ .completion-metrics span {
685
+ font-family: var(--font-mono);
686
+ font-size: 12px;
687
+ color: var(--text-dim);
688
+ background: rgba(255, 255, 255, 0.04);
689
+ padding: 4px 10px;
690
+ border-radius: 6px;
691
+ border: 1px solid var(--border);
692
+ }
693
+
694
+ .completion-launch-btn {
695
+ display: block;
696
+ width: 100%;
697
+ padding: 14px 24px;
698
+ background: linear-gradient(135deg, var(--accent-green), #16a34a);
699
+ border: none;
700
+ border-radius: 10px;
701
+ color: #000;
702
+ font-family: var(--font-sans);
703
+ font-weight: 600;
704
+ font-size: 15px;
705
+ cursor: pointer;
706
+ transition: transform 0.15s, opacity 0.2s, box-shadow 0.3s;
707
+ margin-bottom: 12px;
708
+ }
709
+
710
+ .completion-launch-btn:hover {
711
+ transform: scale(1.02);
712
+ box-shadow: 0 0 20px rgba(34, 197, 94, 0.3);
713
+ }
714
+
715
+ .completion-launch-btn:disabled {
716
+ opacity: 0.5;
717
+ cursor: not-allowed;
718
+ transform: none;
719
+ }
720
+
721
+ .completion-launch-btn.ready {
722
+ background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
723
+ animation: glow-border 2s ease-in-out infinite;
724
+ }
725
+
726
+ .completion-status {
727
+ font-family: var(--font-mono);
728
+ font-size: 12px;
729
+ color: var(--text-dim);
730
+ min-height: 20px;
731
+ }
732
+
733
+ .launch-url {
734
+ color: var(--accent-cyan);
735
+ text-decoration: none;
736
+ font-size: 14px;
737
+ font-weight: 500;
738
+ }
739
+
740
+ .launch-url:hover {
741
+ text-decoration: underline;
742
+ text-shadow: 0 0 10px rgba(6, 182, 212, 0.5);
743
+ }
744
+
745
+ /* === Animations === */
746
+ @keyframes pulse-dot {
747
+ 0%, 100% { box-shadow: 0 0 8px var(--accent-cyan); }
748
+ 50% { box-shadow: 0 0 20px var(--accent-cyan), 0 0 40px rgba(6, 182, 212, 0.3); }
749
+ }
750
+
751
+ @keyframes glow-border {
752
+ 0%, 100% { border-color: rgba(6, 182, 212, 0.2); }
753
+ 50% { border-color: rgba(6, 182, 212, 0.5); }
754
+ }
755
+
756
+ @keyframes typewriter-cursor {
757
+ 0%, 100% { opacity: 1; }
758
+ 50% { opacity: 0; }
759
+ }
760
+
761
+ .cursor-blink::after {
762
+ content: '\2588';
763
+ animation: typewriter-cursor 0.8s step-end infinite;
764
+ color: var(--accent-cyan);
765
+ }
766
+
767
+ /* === Scrollbar === */
768
+ ::-webkit-scrollbar {
769
+ width: 6px;
770
+ height: 6px;
771
+ }
772
+
773
+ ::-webkit-scrollbar-track {
774
+ background: transparent;
775
+ }
776
+
777
+ ::-webkit-scrollbar-thumb {
778
+ background: rgba(255, 255, 255, 0.1);
779
+ border-radius: 3px;
780
+ }
781
+
782
+ ::-webkit-scrollbar-thumb:hover {
783
+ background: rgba(255, 255, 255, 0.2);
784
+ }
785
+
786
+ /* === Question Cards (Plan Mode) === */
787
+ .plan-questions-card {
788
+ max-width: 560px;
789
+ max-height: 85vh;
790
+ overflow-y: auto;
791
+ }
792
+
793
+ .plan-questions-header {
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: space-between;
797
+ margin-bottom: 16px;
798
+ }
799
+
800
+ .plan-questions-header .plan-header {
801
+ margin-bottom: 0;
802
+ }
803
+
804
+ .plan-round {
805
+ font-family: var(--font-mono);
806
+ font-size: 11px;
807
+ color: var(--text-dim);
808
+ background: rgba(255, 255, 255, 0.04);
809
+ padding: 4px 10px;
810
+ border-radius: 6px;
811
+ border: 1px solid var(--border);
812
+ }
813
+
814
+ .confidence-meter {
815
+ margin-bottom: 20px;
816
+ }
817
+
818
+ .confidence-bar {
819
+ height: 4px;
820
+ background: rgba(255, 255, 255, 0.1);
821
+ border-radius: 2px;
822
+ overflow: hidden;
823
+ }
824
+
825
+ .confidence-fill {
826
+ height: 100%;
827
+ background: linear-gradient(90deg, var(--accent-cyan), var(--accent-green));
828
+ transition: width 0.5s ease;
829
+ }
830
+
831
+ .confidence-label {
832
+ font-size: 0.75rem;
833
+ color: var(--text-dim);
834
+ margin-top: 6px;
835
+ }
836
+
837
+ .plan-questions {
838
+ display: flex;
839
+ flex-direction: column;
840
+ gap: 20px;
841
+ }
842
+
843
+ .question-card {
844
+ padding: 0;
845
+ }
846
+
847
+ .question-header {
848
+ display: inline-block;
849
+ background: rgba(6, 182, 212, 0.15);
850
+ color: var(--accent-cyan);
851
+ padding: 2px 8px;
852
+ border-radius: 4px;
853
+ font-size: 0.75rem;
854
+ text-transform: uppercase;
855
+ letter-spacing: 0.05em;
856
+ margin-bottom: 8px;
857
+ font-family: var(--font-mono);
858
+ font-weight: 500;
859
+ }
860
+
861
+ .question-text {
862
+ font-size: 0.95rem;
863
+ color: var(--text-bright);
864
+ font-weight: 500;
865
+ margin-bottom: 6px;
866
+ line-height: 1.4;
867
+ }
868
+
869
+ .select-hint {
870
+ color: var(--text-dim);
871
+ font-size: 0.75rem;
872
+ margin-bottom: 8px;
873
+ font-style: italic;
874
+ }
875
+
876
+ .question-options {
877
+ display: flex;
878
+ flex-direction: column;
879
+ gap: 6px;
880
+ }
881
+
882
+ .question-option {
883
+ cursor: pointer;
884
+ border: 1px solid rgba(255, 255, 255, 0.08);
885
+ border-radius: 8px;
886
+ padding: 12px 16px;
887
+ transition: all 0.2s ease;
888
+ background: rgba(255, 255, 255, 0.02);
889
+ }
890
+
891
+ .question-option:hover {
892
+ border-color: rgba(6, 182, 212, 0.3);
893
+ background: rgba(6, 182, 212, 0.05);
894
+ }
895
+
896
+ .question-option.selected {
897
+ border-color: var(--accent-cyan);
898
+ background: rgba(6, 182, 212, 0.1);
899
+ box-shadow: 0 0 12px rgba(6, 182, 212, 0.1);
900
+ }
901
+
902
+ .option-label {
903
+ font-weight: 600;
904
+ color: var(--text-bright);
905
+ font-size: 0.95rem;
906
+ }
907
+
908
+ .option-description {
909
+ color: var(--text-dim);
910
+ font-size: 0.8rem;
911
+ margin-top: 2px;
912
+ line-height: 1.4;
913
+ }
914
+
915
+ .confirm-selections-btn {
916
+ width: 100%;
917
+ padding: 12px;
918
+ background: linear-gradient(135deg, var(--accent-cyan), #0891b2);
919
+ color: #000;
920
+ border: none;
921
+ border-radius: 8px;
922
+ font-weight: 600;
923
+ font-size: 1rem;
924
+ font-family: var(--font-sans);
925
+ cursor: pointer;
926
+ margin-top: 20px;
927
+ transition: all 0.2s;
928
+ }
929
+
930
+ .confirm-selections-btn:hover:not(:disabled) {
931
+ transform: scale(1.01);
932
+ box-shadow: 0 0 20px rgba(6, 182, 212, 0.3);
933
+ }
934
+
935
+ .confirm-selections-btn:disabled {
936
+ opacity: 0.3;
937
+ cursor: not-allowed;
938
+ transform: none;
939
+ }
940
+
941
+ .refining-state {
942
+ text-align: center;
943
+ padding: 32px;
944
+ color: var(--text-dim);
945
+ display: flex;
946
+ flex-direction: column;
947
+ align-items: center;
948
+ gap: 16px;
949
+ }
950
+
951
+ .refining-spinner {
952
+ width: 24px;
953
+ height: 24px;
954
+ border: 2px solid rgba(255, 255, 255, 0.1);
955
+ border-top-color: var(--accent-cyan);
956
+ border-radius: 50%;
957
+ animation: spin 0.8s linear infinite;
958
+ }
959
+
960
+ @keyframes spin {
961
+ to { transform: rotate(360deg); }
962
+ }
963
+
964
+ /* ── Chat Interface ── */
965
+ .chat-container {
966
+ display: flex;
967
+ flex-direction: column;
968
+ height: 100%;
969
+ max-height: 80vh;
970
+ background: rgba(10, 10, 15, 0.95);
971
+ border: 1px solid rgba(100, 200, 255, 0.15);
972
+ border-radius: 12px;
973
+ overflow: hidden;
974
+ max-width: 600px;
975
+ margin: 5vh auto 0;
976
+ }
977
+
978
+ .chat-messages {
979
+ flex: 1;
980
+ overflow-y: auto;
981
+ padding: 20px;
982
+ display: flex;
983
+ flex-direction: column;
984
+ gap: 12px;
985
+ }
986
+
987
+ .chat-msg {
988
+ max-width: 85%;
989
+ animation: chatFadeIn 0.3s ease;
990
+ }
991
+
992
+ .chat-msg-architect {
993
+ align-self: flex-start;
994
+ }
995
+
996
+ .chat-msg-user {
997
+ align-self: flex-end;
998
+ }
999
+
1000
+ .chat-msg-text {
1001
+ padding: 10px 14px;
1002
+ border-radius: 12px;
1003
+ font-size: 14px;
1004
+ line-height: 1.5;
1005
+ }
1006
+
1007
+ .chat-msg-architect .chat-msg-text {
1008
+ background: rgba(100, 200, 255, 0.1);
1009
+ color: rgba(200, 220, 255, 0.9);
1010
+ border-bottom-left-radius: 4px;
1011
+ }
1012
+
1013
+ .chat-msg-user .chat-msg-text {
1014
+ background: rgba(100, 200, 255, 0.2);
1015
+ color: rgba(220, 240, 255, 0.95);
1016
+ border-bottom-right-radius: 4px;
1017
+ }
1018
+
1019
+ .chat-input-bar {
1020
+ display: flex;
1021
+ gap: 8px;
1022
+ padding: 12px 16px;
1023
+ border-top: 1px solid rgba(100, 200, 255, 0.1);
1024
+ background: rgba(5, 5, 10, 0.8);
1025
+ }
1026
+
1027
+ .chat-input-bar input {
1028
+ flex: 1;
1029
+ background: rgba(20, 20, 30, 0.8);
1030
+ border: 1px solid rgba(100, 200, 255, 0.2);
1031
+ border-radius: 8px;
1032
+ padding: 10px 14px;
1033
+ color: rgba(200, 220, 255, 0.9);
1034
+ font-size: 14px;
1035
+ outline: none;
1036
+ }
1037
+
1038
+ .chat-input-bar input:focus {
1039
+ border-color: rgba(100, 200, 255, 0.4);
1040
+ }
1041
+
1042
+ .chat-input-bar button {
1043
+ background: rgba(100, 200, 255, 0.15);
1044
+ border: 1px solid rgba(100, 200, 255, 0.3);
1045
+ border-radius: 8px;
1046
+ padding: 10px 20px;
1047
+ color: rgba(100, 200, 255, 0.9);
1048
+ cursor: pointer;
1049
+ font-size: 14px;
1050
+ transition: all 0.2s;
1051
+ }
1052
+
1053
+ .chat-input-bar button:hover {
1054
+ background: rgba(100, 200, 255, 0.25);
1055
+ }
1056
+
1057
+ /* Chat cards (inline) */
1058
+ .chat-cards {
1059
+ margin-top: 8px;
1060
+ display: flex;
1061
+ flex-direction: column;
1062
+ gap: 8px;
1063
+ }
1064
+
1065
+ .chat-card {
1066
+ background: rgba(20, 20, 35, 0.8);
1067
+ border: 1px solid rgba(100, 200, 255, 0.15);
1068
+ border-radius: 10px;
1069
+ padding: 12px;
1070
+ }
1071
+
1072
+ .chat-card-header {
1073
+ font-size: 12px;
1074
+ text-transform: uppercase;
1075
+ letter-spacing: 0.05em;
1076
+ color: rgba(100, 200, 255, 0.6);
1077
+ margin-bottom: 4px;
1078
+ }
1079
+
1080
+ .chat-card-question {
1081
+ font-size: 13px;
1082
+ color: rgba(200, 220, 255, 0.8);
1083
+ margin-bottom: 8px;
1084
+ }
1085
+
1086
+ .chat-card-options {
1087
+ display: flex;
1088
+ flex-direction: column;
1089
+ gap: 4px;
1090
+ }
1091
+
1092
+ .chat-card-option {
1093
+ padding: 8px 12px;
1094
+ border: 1px solid rgba(100, 200, 255, 0.1);
1095
+ border-radius: 6px;
1096
+ cursor: pointer;
1097
+ transition: all 0.2s;
1098
+ }
1099
+
1100
+ .chat-card-option:hover {
1101
+ background: rgba(100, 200, 255, 0.08);
1102
+ border-color: rgba(100, 200, 255, 0.25);
1103
+ }
1104
+
1105
+ .chat-card-option.selected {
1106
+ background: rgba(100, 200, 255, 0.15);
1107
+ border-color: rgba(100, 200, 255, 0.4);
1108
+ }
1109
+
1110
+ .chat-card-option-label {
1111
+ font-size: 13px;
1112
+ color: rgba(200, 220, 255, 0.9);
1113
+ font-weight: 500;
1114
+ }
1115
+
1116
+ .chat-card-option-desc {
1117
+ font-size: 11px;
1118
+ color: rgba(200, 220, 255, 0.5);
1119
+ margin-top: 2px;
1120
+ }
1121
+
1122
+ /* Ready state */
1123
+ .chat-ready-summary {
1124
+ margin-top: 8px;
1125
+ padding: 8px 12px;
1126
+ background: rgba(80, 200, 120, 0.1);
1127
+ border: 1px solid rgba(80, 200, 120, 0.2);
1128
+ border-radius: 8px;
1129
+ font-size: 13px;
1130
+ color: rgba(80, 200, 120, 0.9);
1131
+ }
1132
+
1133
+ .chat-build-btn {
1134
+ margin-top: 10px;
1135
+ width: 100%;
1136
+ padding: 12px;
1137
+ background: rgba(80, 200, 120, 0.2);
1138
+ border: 1px solid rgba(80, 200, 120, 0.4);
1139
+ border-radius: 8px;
1140
+ color: rgba(80, 200, 120, 0.95);
1141
+ font-size: 15px;
1142
+ font-weight: 600;
1143
+ cursor: pointer;
1144
+ transition: all 0.2s;
1145
+ }
1146
+
1147
+ .chat-build-btn:hover {
1148
+ background: rgba(80, 200, 120, 0.3);
1149
+ }
1150
+
1151
+ /* Hide header input bar during chat */
1152
+ #header.chat-active #input-bar {
1153
+ display: none;
1154
+ }
1155
+
1156
+ @keyframes chatFadeIn {
1157
+ from { opacity: 0; transform: translateY(8px); }
1158
+ to { opacity: 1; transform: translateY(0); }
1159
+ }
1160
+
1161
+ /* === Responsive === */
1162
+ @media (max-width: 900px) {
1163
+ #app {
1164
+ grid-template-columns: 1fr;
1165
+ grid-template-rows: 60px 300px 1fr 200px;
1166
+ }
1167
+ #orb-container {
1168
+ grid-column: 1;
1169
+ grid-row: 2;
1170
+ }
1171
+ #timeline-panel {
1172
+ grid-column: 1;
1173
+ grid-row: 3;
1174
+ border-left: none;
1175
+ border-top: 1px solid var(--border);
1176
+ }
1177
+ #code-panel {
1178
+ grid-column: 1;
1179
+ grid-row: 4;
1180
+ }
1181
+ }