declare-cc 0.5.9 → 1.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.
@@ -8,70 +8,96 @@
8
8
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9
9
 
10
10
  :root {
11
- --bg: #0e0e12;
12
- --surface: #16161e;
13
- --surface2: #1e1e2a;
14
- --border: #2a2a38;
15
- --text: #c8c8d8;
16
- --text-dim: #6e6e88;
17
- --text-bright: #e8e8f0;
18
-
19
- --decl-color: #4a9eff;
20
- --decl-bg: #0d2240;
21
- --decl-border: #1a4880;
22
-
23
- --mile-color: #a66bff;
24
- --mile-bg: #1a0d33;
25
- --mile-border: #3d1f6e;
26
-
27
- --act-color: #34d399;
28
- --act-bg: #0a2018;
29
- --act-border: #1a4d34;
30
-
31
- /* done tones — dimmed hue-specific variants, not grey */
32
- --decl-done-color: #4a7ab8;
33
- --decl-done-bg: #0a1c2e;
34
- --decl-done-border: #163454;
35
-
36
- --mile-done-color: #7050b8;
37
- --mile-done-bg: #130c28;
38
- --mile-done-border: #251848;
39
-
40
- --act-done-color: #26906a;
41
- --act-done-bg: #08180f;
42
- --act-done-border: #123428;
11
+ /* ── Mesh/Deco-inspired dark palette ── */
12
+ --bg: #111111;
13
+ --surface: #1a1a1a;
14
+ --surface2: #222222;
15
+ --surface3: #2a2a2a;
16
+ --border: rgba(255,255,255,0.08);
17
+ --border-strong: rgba(255,255,255,0.14);
18
+ --text: #d4d4d4;
19
+ --text-dim: #999999;
20
+ --text-bright: #f5f5f5;
21
+ --text-muted: #6b6b6b;
22
+
23
+ /* Brand accent — deco lime green */
24
+ --accent: #d0ec1a;
25
+ --accent-dim: rgba(208, 236, 26, 0.12);
26
+ --accent-border: rgba(208, 236, 26, 0.25);
27
+
28
+ --decl-color: #93c5fd;
29
+ --decl-bg: rgba(147, 197, 253, 0.06);
30
+ --decl-border: rgba(147, 197, 253, 0.15);
31
+
32
+ --mile-color: #a595ff;
33
+ --mile-bg: rgba(165, 149, 255, 0.06);
34
+ --mile-border: rgba(165, 149, 255, 0.15);
35
+
36
+ --act-color: #86efac;
37
+ --act-bg: rgba(134, 239, 172, 0.06);
38
+ --act-border: rgba(134, 239, 172, 0.15);
39
+
40
+ /* done tones */
41
+ --decl-done-color: #6b96c8;
42
+ --decl-done-bg: rgba(107, 150, 200, 0.05);
43
+ --decl-done-border: rgba(107, 150, 200, 0.10);
44
+
45
+ --mile-done-color: #8878c0;
46
+ --mile-done-bg: rgba(136, 120, 192, 0.05);
47
+ --mile-done-border: rgba(136, 120, 192, 0.10);
48
+
49
+ --act-done-color: #5cb88a;
50
+ --act-done-bg: rgba(92, 184, 138, 0.05);
51
+ --act-done-border: rgba(92, 184, 138, 0.10);
43
52
 
44
53
  /* workflow progress tones */
45
- --planned-color: #5ba3ff;
46
- --planned-bg: #091828;
47
- --planned-border: #12305a;
54
+ --planned-color: #93c5fd;
55
+ --planned-bg: rgba(147, 197, 253, 0.06);
56
+ --planned-border: rgba(147, 197, 253, 0.15);
48
57
 
49
58
  --executing-color: #fbbf24;
50
- --executing-bg: #1a1200;
51
- --executing-border:#3d2c00;
59
+ --executing-bg: rgba(251, 191, 36, 0.06);
60
+ --executing-border: rgba(251, 191, 36, 0.18);
61
+
62
+ --broken-color: #f87171;
63
+ --broken-bg: rgba(248, 113, 113, 0.06);
64
+ --broken-border: rgba(248, 113, 113, 0.18);
52
65
 
53
- --broken-color: #ff4d6d;
54
- --broken-bg: #2a0a10;
55
- --broken-border: #5a1520;
66
+ /* integrity wholeness indicators */
67
+ --integrity-whole: #86efac;
68
+ --integrity-whole-glow: rgba(134, 239, 172, 0.2);
69
+ --integrity-partial: #fbbf24;
70
+ --integrity-partial-glow: rgba(251, 191, 36, 0.2);
71
+ --integrity-broken: #f87171;
72
+ --integrity-broken-glow: rgba(248, 113, 113, 0.2);
56
73
 
57
- --renegotiated-color: #ffa040;
58
- --renegotiated-bg: #251400;
59
- --renegotiated-border: #5a3000;
74
+ --wholeness-whole: #86efac;
75
+ --wholeness-partial: #fbbf24;
76
+ --wholeness-broken: #f87171;
77
+
78
+ --renegotiated-color: #fbbf24;
79
+ --renegotiated-bg: rgba(251, 191, 36, 0.06);
80
+ --renegotiated-border: rgba(251, 191, 36, 0.18);
60
81
 
61
82
  --panel-width: 360px;
62
- --status-bar-height: 52px;
83
+ --status-bar-height: 48px;
84
+ --topbar-height: 0px;
85
+ --radius: 6px;
86
+ --radius-lg: 10px;
63
87
  }
64
88
 
65
89
  body {
66
90
  background: var(--bg);
67
91
  color: var(--text);
68
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
69
- font-size: 13px;
92
+ font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
93
+ font-size: 16px;
70
94
  line-height: 1.5;
71
95
  height: 100vh;
72
96
  display: flex;
73
97
  flex-direction: column;
74
98
  overflow: hidden;
99
+ -webkit-font-smoothing: antialiased;
100
+ -moz-osx-font-smoothing: grayscale;
75
101
  }
76
102
 
77
103
  /* ── Status bar ── */
@@ -81,7 +107,7 @@
81
107
  border-bottom: 1px solid var(--border);
82
108
  display: flex;
83
109
  align-items: center;
84
- gap: 24px;
110
+ gap: 0;
85
111
  padding: 0 20px;
86
112
  flex-shrink: 0;
87
113
  position: relative;
@@ -92,7 +118,39 @@
92
118
  font-weight: 600;
93
119
  font-size: 14px;
94
120
  color: var(--text-bright);
95
- margin-right: 8px;
121
+ letter-spacing: -0.01em;
122
+ cursor: pointer;
123
+ transition: color 0.15s;
124
+ }
125
+ #status-bar .project-name:hover { color: var(--accent); }
126
+
127
+ /* Breadcrumb inline in status bar */
128
+ #status-breadcrumb {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 8px;
132
+ margin-left: 0;
133
+ font-size: 13px;
134
+ }
135
+ #status-breadcrumb .bc-sep {
136
+ color: var(--text-muted);
137
+ font-size: 11px;
138
+ }
139
+ #status-breadcrumb .bc-link {
140
+ color: var(--text-dim);
141
+ cursor: pointer;
142
+ font-weight: 500;
143
+ transition: color 0.15s;
144
+ }
145
+ #status-breadcrumb .bc-link:hover { color: var(--text-bright); }
146
+ #status-breadcrumb .bc-current {
147
+ color: var(--text-bright);
148
+ font-weight: 600;
149
+ }
150
+ #status-breadcrumb .bc-title {
151
+ color: var(--text-dim);
152
+ font-size: 12px;
153
+ font-weight: 400;
96
154
  }
97
155
 
98
156
  .stat-group {
@@ -121,7 +179,24 @@
121
179
  .health-errors { background: #2a0a10; color: #ff4d6d; border: 1px solid #5a1520; }
122
180
  .health-unknown { background: var(--surface2); color: var(--text-dim); border: 1px solid var(--border); }
123
181
 
182
+ .status-pill {
183
+ font-size: 11px;
184
+ font-weight: 500;
185
+ padding: 2px 10px;
186
+ border-radius: 99px;
187
+ border: 1px solid var(--border);
188
+ color: var(--text-dim);
189
+ white-space: nowrap;
190
+ }
191
+ .status-pill .pill-value {
192
+ font-weight: 600;
193
+ }
194
+ .status-pill.integrity-ok .pill-value { color: var(--integrity-whole); }
195
+ .status-pill.integrity-warn .pill-value { color: var(--integrity-partial); }
196
+ .status-pill.integrity-bad .pill-value { color: var(--integrity-broken); }
197
+
124
198
  .spacer { flex: 1; }
199
+ /* Status bar uses margin-left:auto on .status-right instead of spacer */
125
200
 
126
201
  #last-updated {
127
202
  color: var(--text-dim);
@@ -129,23 +204,83 @@
129
204
  white-space: nowrap;
130
205
  }
131
206
 
132
- #refresh-btn {
133
- background: var(--surface2);
207
+ #view-toggle {
208
+ background: transparent;
134
209
  border: 1px solid var(--border);
135
- color: var(--text);
136
- padding: 5px 14px;
137
- border-radius: 6px;
210
+ color: var(--text-dim);
211
+ width: 28px;
212
+ height: 28px;
213
+ border-radius: var(--radius);
138
214
  cursor: pointer;
139
- font-size: 12px;
140
- transition: background 0.15s, border-color 0.15s;
215
+ font-size: 14px;
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ transition: all 0.15s ease;
220
+ padding: 0;
221
+ margin-left: 10px;
222
+ flex-shrink: 0;
223
+ }
224
+ #view-toggle:hover { background: var(--surface2); color: var(--text); border-color: var(--border-strong); }
225
+ #view-toggle:active { transform: scale(0.97); }
226
+
227
+ /* Right side: integrity + next/execute */
228
+ .status-right {
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 12px;
232
+ margin-left: auto;
233
+ flex-shrink: 0;
234
+ }
235
+
236
+ #execute-main-btn {
237
+ background: var(--accent-dim);
238
+ border: 1px solid var(--accent-border);
239
+ color: var(--accent);
240
+ padding: 6px 18px;
241
+ border-radius: var(--radius);
242
+ cursor: pointer;
243
+ font-size: 13px;
244
+ font-weight: 600;
245
+ transition: all 0.15s ease;
246
+ white-space: nowrap;
247
+ }
248
+ #execute-main-btn:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
249
+ #execute-main-btn:active { transform: scale(0.97); }
250
+ #execute-main-btn:disabled { opacity: 0.4; cursor: not-allowed; }
251
+ #execute-main-btn kbd {
252
+ background: rgba(255,255,255,0.08);
253
+ border: 1px solid rgba(255,255,255,0.12);
254
+ border-radius: 3px;
255
+ padding: 1px 5px;
256
+ font-size: 10px;
257
+ margin-right: 3px;
258
+ vertical-align: baseline;
259
+ }
260
+ #execute-main-btn.btn-next {
261
+ background: var(--surface2);
262
+ border-color: var(--border-strong);
263
+ color: var(--text);
264
+ }
265
+ #execute-main-btn.btn-next:hover { background: var(--surface3); }
266
+ #execute-main-btn.btn-plan {
267
+ background: var(--accent-dim);
268
+ border-color: var(--accent-border);
269
+ color: var(--accent);
270
+ }
271
+ #execute-main-btn.btn-plan:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
272
+ #execute-main-btn.btn-done {
273
+ background: rgba(134, 239, 172, 0.08);
274
+ border-color: rgba(134, 239, 172, 0.2);
275
+ color: #86efac;
141
276
  }
142
- #refresh-btn:hover { background: #252535; border-color: #3a3a50; }
143
- #refresh-btn:active { transform: scale(0.97); }
144
277
 
145
278
  /* ── Main layout ── */
146
279
  #main {
147
280
  flex: 1;
148
281
  overflow: hidden;
282
+ display: flex;
283
+ flex-direction: column;
149
284
  }
150
285
 
151
286
  /* ── Canvas area — reserve space for fixed sidebar ── */
@@ -320,6 +455,11 @@
320
455
  color: var(--renegotiated-color);
321
456
  }
322
457
 
458
+ /* Wholeness left-border indicator */
459
+ .node.wholeness-whole { border-left: 3px solid var(--wholeness-whole); }
460
+ .node.wholeness-partial { border-left: 3px solid var(--wholeness-partial); }
461
+ .node.wholeness-broken { border-left: 3px solid var(--wholeness-broken); }
462
+
323
463
  .node-id {
324
464
  font-size: 10px;
325
465
  font-weight: 700;
@@ -363,13 +503,37 @@
363
503
  background: rgba(255,255,255,0.06);
364
504
  }
365
505
 
506
+ /* Integrity wholeness dot */
507
+ .integrity-dot {
508
+ display: inline-block;
509
+ width: 7px;
510
+ height: 7px;
511
+ border-radius: 50%;
512
+ margin-left: 6px;
513
+ vertical-align: middle;
514
+ position: relative;
515
+ top: -0.5px;
516
+ }
517
+ .integrity-dot.integrity-whole {
518
+ background: var(--integrity-whole);
519
+ box-shadow: 0 0 6px var(--integrity-whole-glow);
520
+ }
521
+ .integrity-dot.integrity-partial {
522
+ background: var(--integrity-partial);
523
+ box-shadow: 0 0 6px var(--integrity-partial-glow);
524
+ }
525
+ .integrity-dot.integrity-broken {
526
+ background: var(--integrity-broken);
527
+ box-shadow: 0 0 6px var(--integrity-broken-glow);
528
+ }
529
+
366
530
  /* ── Side panel — always visible, fixed right column ── */
367
531
  #side-panel {
368
532
  position: fixed;
369
- top: var(--status-bar-height);
533
+ top: calc(var(--topbar-height) + var(--status-bar-height));
370
534
  right: 0;
371
535
  width: var(--panel-width);
372
- height: calc(100vh - var(--status-bar-height));
536
+ height: calc(100vh - var(--topbar-height) - var(--status-bar-height));
373
537
  background: var(--surface);
374
538
  border-left: 1px solid var(--border);
375
539
  display: flex;
@@ -444,6 +608,20 @@
444
608
  margin-bottom: 20px;
445
609
  }
446
610
 
611
+ /* Wholeness badge in detail panel */
612
+ .wholeness-badge {
613
+ display: inline-block;
614
+ padding: 2px 10px;
615
+ border-radius: 10px;
616
+ font-size: 11px;
617
+ font-weight: 600;
618
+ letter-spacing: 0.04em;
619
+ text-transform: uppercase;
620
+ }
621
+ .wholeness-badge.wb-whole { background: #0a2018; color: var(--wholeness-whole); border: 1px solid #1a4d34; }
622
+ .wholeness-badge.wb-partial { background: #1a1200; color: var(--wholeness-partial); border: 1px solid #3d2c00; }
623
+ .wholeness-badge.wb-broken { background: #2a0a10; color: var(--wholeness-broken); border: 1px solid #5a1520; }
624
+
447
625
  .detail-section {
448
626
  margin-bottom: 20px;
449
627
  }
@@ -591,38 +769,29 @@
591
769
  }
592
770
  #focus-hint.visible { opacity: 1; }
593
771
  /* ── Activity feed ── */
772
+ /* ── Activity sidebar (right panel in drill-body) ── */
594
773
  #activity-feed {
595
- position: fixed;
596
- bottom: 0;
597
- left: 0;
598
- right: var(--panel-width);
599
- height: 36px;
774
+ width: 280px;
775
+ flex-shrink: 0;
600
776
  background: var(--surface);
601
- border-top: 1px solid var(--border);
777
+ border-left: 1px solid var(--border);
602
778
  display: flex;
603
- align-items: center;
779
+ flex-direction: column;
604
780
  overflow: hidden;
605
- z-index: 20;
606
- transition: height 0.2s ease;
607
781
  }
608
- #activity-feed.expanded { height: 180px; align-items: flex-start; }
609
- #activity-feed.has-events { border-top-color: var(--act-border); }
610
782
 
611
783
  #activity-toggle {
612
784
  flex-shrink: 0;
613
- padding: 0 12px;
785
+ padding: 12px 16px 8px;
614
786
  font-size: 10px;
615
787
  font-weight: 700;
616
788
  letter-spacing: 0.06em;
789
+ text-transform: uppercase;
617
790
  color: var(--text-dim);
618
- cursor: pointer;
619
- user-select: none;
620
791
  display: flex;
621
792
  align-items: center;
622
793
  gap: 6px;
623
- height: 36px;
624
794
  }
625
- #activity-toggle:hover { color: var(--text-bright); }
626
795
  #activity-pulse {
627
796
  width: 6px; height: 6px;
628
797
  border-radius: 50%;
@@ -636,109 +805,3478 @@
636
805
  50% { opacity: 0.3; }
637
806
  }
638
807
 
808
+ #activity-tabs {
809
+ display: flex;
810
+ gap: 4px;
811
+ align-items: center;
812
+ flex: 1;
813
+ }
814
+ .activity-tab {
815
+ font-size: 10px;
816
+ font-weight: 700;
817
+ letter-spacing: 0.06em;
818
+ text-transform: uppercase;
819
+ color: var(--text-muted);
820
+ cursor: pointer;
821
+ padding: 2px 6px;
822
+ border-radius: 3px;
823
+ transition: color 0.15s, background 0.15s;
824
+ }
825
+ .activity-tab:hover { color: var(--text-dim); }
826
+ .activity-tab.active { color: var(--text-bright); background: var(--surface3); }
827
+
828
+ .activity-tab-content { display: none; }
829
+ .activity-tab-content.active { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
830
+
831
+ #activity-cards.active { overflow-y: auto; padding: 8px; gap: 8px; }
832
+ #activity-cards-active { display: flex; flex-direction: column; gap: 6px; }
833
+ #activity-cards-recent { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); }
834
+ #activity-cards-recent:empty { display: none; }
835
+ #activity-cards::-webkit-scrollbar { width: 4px; }
836
+ #activity-cards::-webkit-scrollbar-track { background: transparent; }
837
+ #activity-cards::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
838
+
639
839
  #activity-list {
640
840
  flex: 1;
641
841
  overflow-y: auto;
642
842
  overflow-x: hidden;
643
- padding: 0 8px;
644
- font-size: 11px;
645
- font-family: monospace;
843
+ padding: 8px 0;
844
+ font-size: 12px;
646
845
  display: flex;
647
846
  flex-direction: column;
648
847
  gap: 0;
649
848
  }
650
- #activity-feed:not(.expanded) #activity-list { flex-direction: row; align-items: center; gap: 16px; overflow: hidden; white-space: nowrap; }
849
+ #activity-list::-webkit-scrollbar { width: 4px; }
850
+ #activity-list::-webkit-scrollbar-track { background: transparent; }
851
+ #activity-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
651
852
 
652
853
  .activity-event {
653
- padding: 4px 0;
854
+ padding: 8px 16px;
654
855
  color: var(--text-dim);
655
- border-bottom: 1px solid var(--surface2);
656
856
  display: flex;
657
- align-items: baseline;
658
- gap: 8px;
857
+ flex-direction: column;
858
+ gap: 3px;
659
859
  flex-shrink: 0;
860
+ border-bottom: 1px solid rgba(255,255,255,0.03);
861
+ transition: background 0.15s;
660
862
  }
661
- #activity-feed:not(.expanded) .activity-event { border: none; padding: 0; }
863
+ .activity-event:hover { background: var(--surface2); cursor: default; }
864
+ .activity-event.clickable { cursor: pointer; }
865
+ .activity-event.clickable:hover { background: var(--surface3); }
662
866
  .activity-event:last-child { border-bottom: none; }
867
+ .activity-event.is-new {
868
+ animation: activity-flash 1.5s ease-out;
869
+ }
870
+ @keyframes activity-flash {
871
+ 0% { background: rgba(134, 239, 172, 0.08); }
872
+ 100% { background: transparent; }
873
+ }
663
874
 
664
- .ae-time { opacity: 0.4; font-size: 10px; flex-shrink: 0; }
665
- .ae-icon { flex-shrink: 0; }
666
- .ae-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
667
- .ae-text.agent-start { color: var(--act-color); font-weight: 600; }
668
- .ae-text.agent-done { color: var(--mile-color); }
669
- .ae-text.bash { color: var(--text-dim); }
670
- .ae-text.write { color: var(--decl-color); }
875
+ .ae-top {
876
+ display: flex;
877
+ align-items: center;
878
+ gap: 6px;
879
+ }
880
+ .ae-time { opacity: 0.5; font-size: 11px; flex-shrink: 0; font-family: 'SF Mono', 'Fira Code', monospace; }
881
+ .ae-icon { flex-shrink: 0; font-size: 12px; }
882
+ .ae-label {
883
+ font-size: 12px;
884
+ font-weight: 600;
885
+ overflow: hidden;
886
+ text-overflow: ellipsis;
887
+ white-space: nowrap;
888
+ }
889
+ .ae-label.agent-start { color: var(--act-color); }
890
+ .ae-label.agent-done { color: var(--mile-color); }
891
+ .ae-label.bash { color: var(--text); }
892
+ .ae-label.write { color: var(--decl-color); }
893
+ .ae-label.review { color: var(--accent); }
894
+ .ae-desc {
895
+ font-size: 12px;
896
+ color: var(--text-dim);
897
+ line-height: 1.4;
898
+ overflow: hidden;
899
+ text-overflow: ellipsis;
900
+ white-space: nowrap;
901
+ padding-left: 18px;
902
+ }
671
903
 
672
- </style>
673
- </head>
674
- <body>
904
+ /* ── Execute/Stop button ── */
905
+ .exec-btn {
906
+ background: var(--act-bg);
907
+ border: 1px solid var(--act-border);
908
+ color: var(--act-color);
909
+ padding: 6px 16px;
910
+ border-radius: 6px;
911
+ font-size: 12px;
912
+ font-weight: 600;
913
+ cursor: pointer;
914
+ display: inline-flex;
915
+ align-items: center;
916
+ gap: 6px;
917
+ transition: background 0.15s, border-color 0.15s;
918
+ }
919
+ .exec-btn:hover { background: #0d2818; border-color: #2a6a48; }
920
+ .exec-btn:disabled { opacity: 0.5; cursor: not-allowed; }
675
921
 
676
- <!-- Status bar -->
677
- <div id="status-bar">
678
- <span class="project-name" id="project-name">Declare</span>
679
- <span class="stat-group"><span class="value" id="stat-decls">–</span> Declarations</span>
680
- <span class="stat-group"><span class="value" id="stat-miles">–</span> Milestones</span>
681
- <span class="stat-group"><span class="value" id="stat-acts">–</span> Actions</span>
682
- <span id="health-badge" class="health-badge health-unknown">–</span>
683
- <span class="spacer"></span>
684
- <span id="last-updated"></span>
685
- <button id="refresh-btn">Refresh</button>
686
- </div>
922
+ .exec-btn.stop {
923
+ background: var(--broken-bg);
924
+ border-color: var(--broken-border);
925
+ color: var(--broken-color);
926
+ }
927
+ .exec-btn.stop:hover { background: #3a0e18; border-color: #7a2035; }
687
928
 
688
- <!-- Main -->
689
- <div id="main">
690
- <div id="canvas-wrap">
691
- <div id="canvas-container">
692
- <svg id="edges-svg"></svg>
693
- <div class="layer-section" id="layer-declarations">
694
- <div class="layer-label">Declarations</div>
695
- <div class="layer" id="nodes-declarations"></div>
696
- </div>
697
- <div class="layer-section" id="layer-milestones">
698
- <div class="layer-label">Milestones</div>
699
- <div class="layer" id="nodes-milestones"></div>
700
- </div>
701
- <div class="layer-section" id="layer-actions">
702
- <div class="layer-label">Actions</div>
703
- <div class="layer" id="nodes-actions"></div>
704
- </div>
705
- </div>
706
- </div>
707
- </div>
929
+ /* ── Output log panel ── */
930
+ .output-log {
931
+ background: #0a0a0e;
932
+ border: 1px solid var(--border);
933
+ border-radius: 6px;
934
+ padding: 10px 12px;
935
+ margin-top: 12px;
936
+ max-height: 300px;
937
+ overflow-y: auto;
938
+ font-family: monospace;
939
+ font-size: 11px;
940
+ line-height: 1.5;
941
+ color: var(--text-dim);
942
+ white-space: pre-wrap;
943
+ word-break: break-all;
944
+ }
945
+ .output-log::-webkit-scrollbar { width: 4px; }
946
+ .output-log::-webkit-scrollbar-track { background: transparent; }
947
+ .output-log::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
708
948
 
709
- <!-- Side panel — always visible fixed right column -->
710
- <div id="side-panel">
711
- <div id="panel-header">
712
- <span id="panel-title">Details</span>
713
- </div>
714
- <div id="panel-body">
715
- <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
716
- Click any node to see details.<br>
717
- Click a declaration or milestone<br>to focus its subtree.
718
- </div>
719
- </div>
720
- </div>
949
+ .output-log .exit-code {
950
+ display: block;
951
+ margin-top: 8px;
952
+ padding-top: 8px;
953
+ border-top: 1px solid var(--border);
954
+ font-weight: 700;
955
+ }
956
+ .output-log .exit-code.success { color: var(--act-color); }
957
+ .output-log .exit-code.failure { color: var(--broken-color); }
721
958
 
722
- <!-- Activity feed live agent/tool event stream -->
723
- <div id="activity-feed">
724
- <div id="activity-toggle">
725
- <div id="activity-pulse"></div>
726
- <span id="activity-label">ACTIVITY</span>
727
- </div>
728
- <div id="activity-list">
729
- <span style="color:var(--text-dim);font-size:10px;opacity:0.4">No activity yet agents will appear here when running</span>
730
- </div>
731
- </div>
959
+ /* ── Running node pulse animation ── */
960
+ .node.is-running {
961
+ animation: running-pulse 1.8s ease-in-out infinite;
962
+ box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2);
963
+ }
964
+ @keyframes running-pulse {
965
+ 0%, 100% { box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2); }
966
+ 50% { box-shadow: 0 0 0 3px var(--executing-color), 0 0 24px rgba(251,191,36,0.35); }
967
+ }
732
968
 
733
- <!-- Loading/error overlay -->
734
- <div id="overlay">
735
- <div class="spinner"></div>
736
- <div id="overlay-message">Loading graph…</div>
737
- <div id="overlay-error"></div>
738
- <button id="overlay-retry">Retry</button>
739
- </div>
969
+ /* ── Drill browser — 3-panel layout ── */
970
+ #drill-browser {
971
+ display: none;
972
+ width: 100%;
973
+ flex: 1;
974
+ min-height: 0;
975
+ flex-direction: column;
976
+ }
977
+ #drill-browser.active {
978
+ display: flex;
979
+ }
740
980
 
741
- <div id="focus-hint">Press Esc or click outside to exit focus</div>
742
- <script src="/public/app.js"></script>
981
+ #drill-breadcrumb {
982
+ display: none; /* breadcrumb now lives in status bar */
983
+ }
984
+
985
+ /* 3-panel body: left detail + center list + right activity */
986
+ #drill-body {
987
+ flex: 1;
988
+ display: flex;
989
+ overflow: hidden;
990
+ }
991
+
992
+ /* Left detail panel — shown at level 2+ */
993
+ #drill-detail {
994
+ width: 280px;
995
+ flex-shrink: 0;
996
+ overflow-y: auto;
997
+ background: var(--surface);
998
+ border-right: 1px solid var(--border);
999
+ padding: 20px;
1000
+ display: none;
1001
+ flex-direction: column;
1002
+ gap: 16px;
1003
+ }
1004
+ #drill-detail.visible { display: flex; }
1005
+ #drill-detail[data-node-type="declaration"] {
1006
+ background: linear-gradient(180deg, rgba(134, 239, 172, 0.04) 0%, var(--surface) 40%);
1007
+ border-right-color: rgba(134, 239, 172, 0.12);
1008
+ }
1009
+ #drill-detail[data-node-type="declaration"] .detail-id { color: var(--act-color); }
1010
+ #drill-detail[data-node-type="milestone"] {
1011
+ background: linear-gradient(180deg, rgba(165, 149, 255, 0.04) 0%, var(--surface) 40%);
1012
+ border-right-color: rgba(165, 149, 255, 0.12);
1013
+ }
1014
+ #drill-detail[data-node-type="milestone"] .detail-id { color: var(--mile-color); }
1015
+ #drill-detail[data-node-type="action"] {
1016
+ background: linear-gradient(180deg, rgba(147, 197, 253, 0.04) 0%, var(--surface) 40%);
1017
+ border-right-color: rgba(147, 197, 253, 0.12);
1018
+ }
1019
+ #drill-detail[data-node-type="action"] .detail-id { color: var(--decl-color); }
1020
+ #drill-detail::-webkit-scrollbar { width: 4px; }
1021
+ #drill-detail::-webkit-scrollbar-track { background: transparent; }
1022
+ #drill-detail::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
1023
+
1024
+ .detail-id {
1025
+ font-size: 11px;
1026
+ font-weight: 700;
1027
+ letter-spacing: 0.04em;
1028
+ text-transform: uppercase;
1029
+ color: var(--text-dim);
1030
+ }
1031
+ .detail-title {
1032
+ font-size: 18px;
1033
+ font-weight: 700;
1034
+ color: var(--text-bright);
1035
+ line-height: 1.35;
1036
+ letter-spacing: -0.01em;
1037
+ }
1038
+ .detail-desc {
1039
+ font-size: 13px;
1040
+ color: var(--text);
1041
+ line-height: 1.6;
1042
+ }
1043
+ .detail-desc:empty { display: none; }
1044
+ .detail-badges {
1045
+ display: flex;
1046
+ align-items: center;
1047
+ gap: 6px;
1048
+ flex-wrap: wrap;
1049
+ }
1050
+ .detail-section-label {
1051
+ font-size: 11px;
1052
+ font-weight: 600;
1053
+ letter-spacing: 0.04em;
1054
+ text-transform: uppercase;
1055
+ color: var(--text-dim);
1056
+ margin-top: 4px;
1057
+ }
1058
+ .detail-meta {
1059
+ font-size: 12px;
1060
+ color: var(--text);
1061
+ line-height: 1.5;
1062
+ }
1063
+ .detail-actions {
1064
+ display: flex;
1065
+ gap: 8px;
1066
+ margin-top: auto;
1067
+ padding-top: 12px;
1068
+ border-top: 1px solid var(--border);
1069
+ }
1070
+
1071
+ /* Center list panel */
1072
+ #drill-center {
1073
+ flex: 1;
1074
+ display: flex;
1075
+ flex-direction: column;
1076
+ overflow: hidden;
1077
+ min-width: 0;
1078
+ }
1079
+
1080
+ #drill-context {
1081
+ padding: 12px 24px;
1082
+ font-size: 13px;
1083
+ color: var(--text-dim);
1084
+ line-height: 1.6;
1085
+ flex-shrink: 0;
1086
+ background: var(--bg);
1087
+ }
1088
+ #drill-context:empty { display: none; padding: 0; }
1089
+
1090
+ #drill-list {
1091
+ flex: 1;
1092
+ overflow-y: auto;
1093
+ padding: 16px 24px 32px;
1094
+ background: var(--bg);
1095
+ }
1096
+ #drill-list::-webkit-scrollbar { width: 5px; }
1097
+ #drill-list::-webkit-scrollbar-track { background: transparent; }
1098
+ #drill-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
1099
+
1100
+ /* ── Lifecycle stage sections ── */
1101
+ .lifecycle-stages {
1102
+ display: flex;
1103
+ flex-direction: column;
1104
+ gap: 24px;
1105
+ }
1106
+ .lifecycle-section {
1107
+ display: flex;
1108
+ flex-direction: column;
1109
+ gap: 10px;
1110
+ }
1111
+ .lifecycle-section.collapsed .lifecycle-cards { display: none; }
1112
+ .lifecycle-header {
1113
+ display: flex;
1114
+ align-items: center;
1115
+ gap: 8px;
1116
+ padding: 6px 0;
1117
+ user-select: none;
1118
+ }
1119
+ .lifecycle-icon {
1120
+ font-size: 14px;
1121
+ width: 20px;
1122
+ text-align: center;
1123
+ }
1124
+ .lifecycle-label {
1125
+ font-size: 13px;
1126
+ font-weight: 600;
1127
+ color: var(--text-dim);
1128
+ text-transform: uppercase;
1129
+ letter-spacing: 0.05em;
1130
+ }
1131
+ .lifecycle-count {
1132
+ font-size: 11px;
1133
+ font-weight: 700;
1134
+ padding: 1px 7px;
1135
+ border-radius: 10px;
1136
+ }
1137
+ .lifecycle-toggle {
1138
+ font-size: 10px;
1139
+ color: var(--text-muted);
1140
+ margin-left: 4px;
1141
+ }
1142
+ .lifecycle-header-spacer { flex: 1; }
1143
+ .lifecycle-stage-btn {
1144
+ font-size: 12px;
1145
+ font-weight: 600;
1146
+ padding: 4px 14px;
1147
+ border-radius: 14px;
1148
+ border: 1px solid var(--border-strong);
1149
+ background: var(--surface2);
1150
+ color: var(--text);
1151
+ cursor: pointer;
1152
+ font-family: inherit;
1153
+ transition: all 0.15s ease;
1154
+ }
1155
+ .lifecycle-stage-btn:hover {
1156
+ background: var(--surface3);
1157
+ border-color: var(--accent-border);
1158
+ color: var(--text-bright);
1159
+ }
1160
+ .lifecycle-stage-btn + .lifecycle-stage-btn {
1161
+ margin-left: 4px;
1162
+ }
1163
+
1164
+ /* ── Card derivation progress ── */
1165
+ .drill-card-deriving {
1166
+ border-color: var(--executing-border) !important;
1167
+ background: var(--executing-bg) !important;
1168
+ }
1169
+ .derive-card-indicator {
1170
+ display: flex;
1171
+ align-items: center;
1172
+ gap: 8px;
1173
+ padding: 8px 12px;
1174
+ font-size: 12px;
1175
+ color: var(--executing-color);
1176
+ font-weight: 600;
1177
+ }
1178
+ .derive-spinner {
1179
+ display: inline-block;
1180
+ width: 14px;
1181
+ height: 14px;
1182
+ border: 2px solid var(--executing-border);
1183
+ border-top-color: var(--executing-color);
1184
+ border-radius: 50%;
1185
+ animation: derive-spin 0.8s linear infinite;
1186
+ }
1187
+ @keyframes derive-spin {
1188
+ to { transform: rotate(360deg); }
1189
+ }
1190
+ .derive-card-status {
1191
+ display: inline-flex;
1192
+ align-items: center;
1193
+ gap: 4px;
1194
+ font-size: 11px;
1195
+ color: var(--executing-color);
1196
+ font-weight: 600;
1197
+ margin-left: 4px;
1198
+ }
1199
+ .derive-card-status .derive-spinner {
1200
+ width: 10px;
1201
+ height: 10px;
1202
+ border-width: 1.5px;
1203
+ }
1204
+
1205
+ /* ── Filter chips ── */
1206
+ .lifecycle-filter-chips {
1207
+ display: flex;
1208
+ gap: 6px;
1209
+ flex-wrap: wrap;
1210
+ }
1211
+ .lifecycle-chip {
1212
+ font-size: 12px;
1213
+ padding: 4px 12px;
1214
+ border-radius: 14px;
1215
+ border: 1px solid var(--border);
1216
+ background: transparent;
1217
+ color: var(--text-dim);
1218
+ cursor: pointer;
1219
+ transition: all 0.15s ease;
1220
+ font-family: inherit;
1221
+ }
1222
+ .lifecycle-chip:hover {
1223
+ border-color: var(--border-strong);
1224
+ color: var(--text);
1225
+ }
1226
+ .lifecycle-chip.active {
1227
+ background: var(--chip-color, var(--accent));
1228
+ border-color: var(--chip-color, var(--accent));
1229
+ color: var(--bg);
1230
+ font-weight: 600;
1231
+ }
1232
+ .chip-count {
1233
+ font-weight: 700;
1234
+ margin-left: 2px;
1235
+ }
1236
+
1237
+ /* ── Type badge ── */
1238
+ .lifecycle-type-badge {
1239
+ font-size: 10px;
1240
+ font-weight: 700;
1241
+ padding: 1px 6px;
1242
+ border-radius: 4px;
1243
+ text-transform: uppercase;
1244
+ letter-spacing: 0.04em;
1245
+ }
1246
+ .lifecycle-type-badge.type-declaration {
1247
+ background: rgba(134, 239, 172, 0.12);
1248
+ color: #86efac;
1249
+ }
1250
+ .lifecycle-type-badge.type-milestone {
1251
+ background: rgba(165, 149, 255, 0.12);
1252
+ color: #a595ff;
1253
+ }
1254
+ .lifecycle-type-badge.type-action {
1255
+ background: rgba(147, 197, 253, 0.12);
1256
+ color: #93c5fd;
1257
+ }
1258
+
1259
+ .lifecycle-cards {
1260
+ max-width: none;
1261
+ margin: 0;
1262
+ }
1263
+
1264
+ /* ── Empty state / Onboarding ── */
1265
+ .onboarding-empty {
1266
+ max-width: 560px;
1267
+ margin: 60px auto 0;
1268
+ text-align: center;
1269
+ display: flex;
1270
+ flex-direction: column;
1271
+ align-items: center;
1272
+ gap: 16px;
1273
+ }
1274
+ .onboarding-project {
1275
+ font-size: 28px;
1276
+ font-weight: 700;
1277
+ color: var(--text-bright);
1278
+ letter-spacing: -0.02em;
1279
+ }
1280
+ .onboarding-heading {
1281
+ font-size: 18px;
1282
+ font-weight: 600;
1283
+ color: var(--accent);
1284
+ }
1285
+ .onboarding-desc {
1286
+ font-size: 14px;
1287
+ color: var(--text-dim);
1288
+ line-height: 1.6;
1289
+ max-width: 380px;
1290
+ }
1291
+ .onboarding-form {
1292
+ width: 100%;
1293
+ display: flex;
1294
+ flex-direction: column;
1295
+ gap: 10px;
1296
+ margin-top: 8px;
1297
+ }
1298
+ .onboarding-input, .onboarding-textarea {
1299
+ width: 100%;
1300
+ padding: 10px 14px;
1301
+ font-size: 14px;
1302
+ font-family: inherit;
1303
+ background: var(--surface);
1304
+ border: 1px solid var(--border);
1305
+ border-radius: var(--radius);
1306
+ color: var(--text);
1307
+ outline: none;
1308
+ transition: border-color 0.15s ease;
1309
+ }
1310
+ .onboarding-input:focus, .onboarding-textarea:focus {
1311
+ border-color: var(--accent-border);
1312
+ }
1313
+ .onboarding-textarea { resize: vertical; min-height: 240px; }
1314
+ .onboarding-btn {
1315
+ padding: 10px 24px;
1316
+ font-size: 14px;
1317
+ font-weight: 600;
1318
+ font-family: inherit;
1319
+ background: var(--accent);
1320
+ color: var(--bg);
1321
+ border: none;
1322
+ border-radius: var(--radius);
1323
+ cursor: pointer;
1324
+ transition: opacity 0.15s ease;
1325
+ }
1326
+ .onboarding-btn:hover { opacity: 0.9; }
1327
+ .onboarding-btn:disabled { opacity: 0.5; cursor: default; }
1328
+ .onboarding-error {
1329
+ font-size: 13px;
1330
+ color: var(--broken-color);
1331
+ min-height: 18px;
1332
+ }
1333
+
1334
+ /* ── Onboarding flow (vision → questions → proposals) ── */
1335
+ .onboard-container {
1336
+ width: 100%;
1337
+ padding: 16px 0;
1338
+ }
1339
+ .onboard-stream {
1340
+ font-family: 'SF Mono', 'Fira Code', monospace;
1341
+ font-size: 11px;
1342
+ line-height: 1.5;
1343
+ color: var(--text-muted);
1344
+ max-height: 160px;
1345
+ overflow-y: auto;
1346
+ white-space: pre-wrap;
1347
+ word-break: break-word;
1348
+ margin: 0 0 12px 0;
1349
+ padding: 10px 12px;
1350
+ background: var(--surface);
1351
+ border-radius: var(--radius);
1352
+ border: 1px solid var(--border);
1353
+ }
1354
+ .onboard-stream.streaming {
1355
+ border-color: var(--accent-border);
1356
+ }
1357
+ .onboard-phase-label {
1358
+ font-size: 13px;
1359
+ font-weight: 600;
1360
+ color: var(--accent);
1361
+ text-transform: uppercase;
1362
+ letter-spacing: 0.05em;
1363
+ margin-bottom: 12px;
1364
+ }
1365
+ .onboard-questions {
1366
+ display: flex;
1367
+ flex-direction: column;
1368
+ gap: 10px;
1369
+ }
1370
+ .onboard-question {
1371
+ background: var(--surface);
1372
+ border: 1px solid transparent;
1373
+ border-radius: var(--radius-lg);
1374
+ padding: 18px 20px;
1375
+ display: flex;
1376
+ flex-direction: column;
1377
+ gap: 10px;
1378
+ transition: border-color 0.15s ease;
1379
+ }
1380
+ .onboard-question:focus-within {
1381
+ border-color: var(--accent-border);
1382
+ }
1383
+ .onboard-question .oq-number {
1384
+ font-size: 11px;
1385
+ font-weight: 700;
1386
+ color: var(--accent);
1387
+ letter-spacing: 0.04em;
1388
+ }
1389
+ .onboard-question label {
1390
+ font-size: 15px;
1391
+ font-weight: 600;
1392
+ color: var(--text-bright);
1393
+ line-height: 1.4;
1394
+ }
1395
+ .onboard-question .oq-context {
1396
+ font-size: 13px;
1397
+ color: var(--text-dim);
1398
+ line-height: 1.5;
1399
+ }
1400
+ .onboard-question .oq-options {
1401
+ display: flex;
1402
+ flex-wrap: wrap;
1403
+ gap: 8px;
1404
+ }
1405
+ .onboard-question .oq-option {
1406
+ padding: 6px 14px;
1407
+ font-size: 13px;
1408
+ background: var(--surface2);
1409
+ border: 1px solid var(--border);
1410
+ border-radius: 14px;
1411
+ color: var(--text);
1412
+ cursor: pointer;
1413
+ transition: all 0.15s;
1414
+ }
1415
+ .onboard-question .oq-option:hover { border-color: var(--accent); color: var(--accent); }
1416
+ .onboard-question .oq-option.selected { background: var(--accent); color: var(--bg); border-color: var(--accent); }
1417
+ .onboard-question textarea {
1418
+ width: 100%;
1419
+ padding: 10px 14px;
1420
+ font-size: 14px;
1421
+ font-family: inherit;
1422
+ background: var(--surface2);
1423
+ border: 1px solid var(--border);
1424
+ border-radius: var(--radius);
1425
+ color: var(--text);
1426
+ outline: none;
1427
+ resize: vertical;
1428
+ min-height: 48px;
1429
+ line-height: 1.5;
1430
+ }
1431
+ .onboard-question textarea::placeholder { color: var(--text-dim); }
1432
+ .onboard-question textarea:focus { border-color: var(--accent-border); background: var(--surface); }
1433
+ .onboard-actions {
1434
+ display: flex;
1435
+ gap: 10px;
1436
+ margin-top: 16px;
1437
+ padding-top: 8px;
1438
+ }
1439
+ .onboard-actions button {
1440
+ padding: 10px 24px;
1441
+ font-size: 14px;
1442
+ font-weight: 600;
1443
+ font-family: inherit;
1444
+ border-radius: var(--radius-lg);
1445
+ cursor: pointer;
1446
+ transition: all 0.15s;
1447
+ }
1448
+ .onboard-btn-primary {
1449
+ background: var(--accent);
1450
+ color: var(--bg);
1451
+ border: none;
1452
+ }
1453
+ .onboard-btn-primary:hover { opacity: 0.9; }
1454
+ .onboard-btn-secondary {
1455
+ background: transparent;
1456
+ color: var(--text-dim);
1457
+ border: 1px solid var(--border);
1458
+ }
1459
+ .onboard-btn-secondary:hover { border-color: var(--text-dim); color: var(--text); }
1460
+ .onboard-proposal {
1461
+ background: var(--surface);
1462
+ border: 1px solid transparent;
1463
+ border-radius: var(--radius-lg);
1464
+ padding: 18px 20px;
1465
+ margin-bottom: 10px;
1466
+ transition: all 0.2s;
1467
+ }
1468
+ .onboard-proposal:hover {
1469
+ background: var(--surface2);
1470
+ }
1471
+ .onboard-proposal.current {
1472
+ border-color: var(--accent);
1473
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1474
+ }
1475
+ .onboard-proposal.approved {
1476
+ border-left: 3px solid var(--done-color);
1477
+ opacity: 0.65;
1478
+ }
1479
+ .onboard-proposal .op-header {
1480
+ display: flex;
1481
+ align-items: center;
1482
+ gap: 8px;
1483
+ margin-bottom: 8px;
1484
+ }
1485
+ .onboard-proposal .op-check {
1486
+ font-size: 18px;
1487
+ color: var(--done-color);
1488
+ }
1489
+ .onboard-proposal .op-index {
1490
+ font-size: 12px;
1491
+ font-weight: 700;
1492
+ color: var(--text-dim);
1493
+ min-width: 20px;
1494
+ }
1495
+ .onboard-proposal .op-id {
1496
+ font-size: 12px;
1497
+ font-weight: 600;
1498
+ color: var(--accent);
1499
+ }
1500
+ .onboard-title {
1501
+ width: 100%;
1502
+ padding: 8px 14px;
1503
+ font-size: 15px;
1504
+ font-weight: 600;
1505
+ font-family: inherit;
1506
+ background: var(--surface2);
1507
+ border: 1px solid var(--border);
1508
+ border-radius: var(--radius);
1509
+ color: var(--text-bright);
1510
+ outline: none;
1511
+ }
1512
+ .onboard-title:focus { border-color: var(--accent-border); background: var(--surface); }
1513
+ .onboard-statement {
1514
+ width: 100%;
1515
+ padding: 8px 14px;
1516
+ font-size: 14px;
1517
+ font-family: inherit;
1518
+ background: var(--surface2);
1519
+ border: 1px solid var(--border);
1520
+ border-radius: var(--radius);
1521
+ color: var(--text);
1522
+ outline: none;
1523
+ resize: vertical;
1524
+ min-height: 44px;
1525
+ margin-top: 8px;
1526
+ line-height: 1.5;
1527
+ }
1528
+ .onboard-statement:focus { border-color: var(--accent-border); background: var(--surface); }
1529
+ .onboard-reason {
1530
+ font-size: 13px;
1531
+ color: var(--text-dim);
1532
+ margin-top: 8px;
1533
+ font-style: italic;
1534
+ line-height: 1.4;
1535
+ }
1536
+ .onboard-progress {
1537
+ font-size: 14px;
1538
+ color: var(--text-dim);
1539
+ margin-bottom: 12px;
1540
+ font-weight: 600;
1541
+ }
1542
+
1543
+ /* ── Reconnecting banner ── */
1544
+ #reconnect-banner {
1545
+ position: fixed;
1546
+ top: 0;
1547
+ left: 50%;
1548
+ transform: translateX(-50%) translateY(-100%);
1549
+ background: var(--executing-color);
1550
+ color: var(--bg);
1551
+ padding: 6px 20px;
1552
+ font-size: 13px;
1553
+ font-weight: 600;
1554
+ border-radius: 0 0 var(--radius) var(--radius);
1555
+ z-index: 9999;
1556
+ transition: transform 0.3s ease;
1557
+ }
1558
+ #reconnect-banner.visible {
1559
+ transform: translateX(-50%) translateY(0);
1560
+ }
1561
+
1562
+ /* ── Lifecycle card transitions (disabled — instant render) ── */
1563
+
1564
+ /* ── Loading skeleton ── */
1565
+ .skeleton-card {
1566
+ background: var(--surface);
1567
+ border-radius: var(--radius-lg);
1568
+ padding: 18px 20px;
1569
+ animation: skeletonPulse 1.5s ease-in-out infinite;
1570
+ }
1571
+ .skeleton-line {
1572
+ height: 12px;
1573
+ background: var(--surface3);
1574
+ border-radius: 4px;
1575
+ margin-bottom: 8px;
1576
+ }
1577
+ .skeleton-line.short { width: 40%; }
1578
+ .skeleton-line.medium { width: 70%; }
1579
+ .skeleton-line.long { width: 90%; }
1580
+ @keyframes skeletonPulse {
1581
+ 0%, 100% { opacity: 0.6; }
1582
+ 50% { opacity: 1; }
1583
+ }
1584
+
1585
+ /* ── Lifecycle progress bar ── */
1586
+ .lifecycle-progress {
1587
+ display: flex;
1588
+ gap: 2px;
1589
+ height: 4px;
1590
+ border-radius: 2px;
1591
+ overflow: hidden;
1592
+ margin-top: 4px;
1593
+ }
1594
+ .lifecycle-progress-segment {
1595
+ height: 100%;
1596
+ transition: width 0.3s ease;
1597
+ }
1598
+
1599
+ .drill-cards {
1600
+ max-width: 640px;
1601
+ margin: 0 auto;
1602
+ display: flex;
1603
+ flex-direction: column;
1604
+ gap: 10px;
1605
+ }
1606
+
1607
+ /* ── Card item ── */
1608
+ .drill-card {
1609
+ background: var(--surface);
1610
+ border: 1px solid transparent;
1611
+ border-radius: var(--radius-lg);
1612
+ padding: 18px 20px;
1613
+ cursor: pointer;
1614
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease;
1615
+ display: flex;
1616
+ flex-direction: column;
1617
+ gap: 10px;
1618
+ }
1619
+ .drill-card:hover {
1620
+ background: var(--surface2);
1621
+ border-color: var(--border-strong);
1622
+ box-shadow: 0 2px 12px rgba(0,0,0,0.15);
1623
+ }
1624
+ .drill-card.needs-review {
1625
+ /* No border — blends into background until focused */
1626
+ }
1627
+ .drill-card.focused {
1628
+ background: var(--surface2);
1629
+ border-color: var(--card-tint-border, var(--border-strong));
1630
+ box-shadow: inset 2px 0 0 var(--card-tint, var(--accent));
1631
+ }
1632
+
1633
+ /* ── Node-type tint colors on cards ── */
1634
+ .drill-cards[data-node-type="declaration"] .drill-card {
1635
+ --card-tint: #86efac;
1636
+ --card-tint-border: rgba(134, 239, 172, 0.25);
1637
+ --card-tint-glow: rgba(134, 239, 172, 0.08);
1638
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1639
+ }
1640
+ .drill-cards[data-node-type="declaration"] .drill-card .drill-card-id {
1641
+ color: var(--act-color);
1642
+ }
1643
+ .drill-cards[data-node-type="milestone"] .drill-card {
1644
+ --card-tint: #a595ff;
1645
+ --card-tint-border: rgba(165, 149, 255, 0.25);
1646
+ --card-tint-glow: rgba(165, 149, 255, 0.08);
1647
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.03) 0%, var(--surface) 60%);
1648
+ }
1649
+ .drill-cards[data-node-type="milestone"] .drill-card .drill-card-id {
1650
+ color: var(--mile-color);
1651
+ }
1652
+ .drill-cards[data-node-type="action"] .drill-card {
1653
+ --card-tint: #93c5fd;
1654
+ --card-tint-border: rgba(147, 197, 253, 0.25);
1655
+ --card-tint-glow: rgba(147, 197, 253, 0.08);
1656
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.03) 0%, var(--surface) 60%);
1657
+ }
1658
+ .drill-cards[data-node-type="action"] .drill-card .drill-card-id {
1659
+ color: var(--decl-color);
1660
+ }
1661
+
1662
+ /* Hover state preserves tint gradient */
1663
+ .drill-cards[data-node-type="declaration"] .drill-card:hover {
1664
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1665
+ }
1666
+ .drill-cards[data-node-type="milestone"] .drill-card:hover {
1667
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1668
+ }
1669
+ .drill-cards[data-node-type="action"] .drill-card:hover {
1670
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1671
+ }
1672
+
1673
+ /* Focused card gets stronger tint background */
1674
+ .drill-cards[data-node-type="declaration"] .drill-card.focused {
1675
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1676
+ }
1677
+ .drill-cards[data-node-type="milestone"] .drill-card.focused {
1678
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1679
+ }
1680
+ .drill-cards[data-node-type="action"] .drill-card.focused {
1681
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1682
+ }
1683
+ .drill-card .drill-review-btn.approve-btn {
1684
+ background: rgba(134, 239, 172, 0.10);
1685
+ border-color: rgba(134, 239, 172, 0.35);
1686
+ color: #86efac;
1687
+ }
1688
+ .drill-card .drill-review-btn.revision-btn {
1689
+ background: rgba(248, 113, 113, 0.06);
1690
+ border-color: rgba(248, 113, 113, 0.2);
1691
+ color: #f87171;
1692
+ }
1693
+
1694
+ .drill-card-top {
1695
+ display: flex;
1696
+ align-items: flex-start;
1697
+ gap: 12px;
1698
+ }
1699
+ .drill-card-id {
1700
+ font-size: 12px;
1701
+ font-weight: 700;
1702
+ letter-spacing: 0.03em;
1703
+ flex-shrink: 0;
1704
+ padding-top: 2px;
1705
+ color: var(--text-dim);
1706
+ }
1707
+ .drill-card-body {
1708
+ flex: 1;
1709
+ min-width: 0;
1710
+ }
1711
+ .drill-card-title {
1712
+ font-size: 16px;
1713
+ font-weight: 600;
1714
+ color: var(--text-bright);
1715
+ line-height: 1.4;
1716
+ letter-spacing: -0.01em;
1717
+ margin-bottom: 4px;
1718
+ }
1719
+ .drill-card-desc {
1720
+ font-size: 13px;
1721
+ color: var(--text);
1722
+ line-height: 1.5;
1723
+ margin-bottom: 8px;
1724
+ }
1725
+ .drill-card-desc:empty { display: none; margin: 0; }
1726
+
1727
+ .drill-card-badges {
1728
+ display: flex;
1729
+ align-items: center;
1730
+ gap: 6px;
1731
+ flex-wrap: wrap;
1732
+ }
1733
+ .drill-card-stat {
1734
+ font-size: 12px;
1735
+ color: var(--text);
1736
+ font-weight: 400;
1737
+ }
1738
+ .drill-card-stat strong {
1739
+ color: var(--accent);
1740
+ font-weight: 600;
1741
+ }
1742
+ /* Inline action list on milestone cards */
1743
+ .drill-card-action-list {
1744
+ list-style: none;
1745
+ padding: 0;
1746
+ margin: 6px 0 0 0;
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ gap: 2px;
1750
+ }
1751
+ .drill-card-action-list li {
1752
+ font-size: 11px;
1753
+ color: var(--text-dim);
1754
+ display: flex;
1755
+ align-items: baseline;
1756
+ gap: 6px;
1757
+ }
1758
+ .drill-card-action-list li .al-icon {
1759
+ width: 10px;
1760
+ text-align: center;
1761
+ flex-shrink: 0;
1762
+ font-size: 10px;
1763
+ }
1764
+ .drill-card-action-list li.done { color: var(--text-muted); text-decoration: line-through; }
1765
+ .drill-card-action-list li.done .al-icon { color: var(--done-color, #86efac); }
1766
+ .drill-card-action-list li.planned .al-icon { color: var(--accent); }
1767
+ .drill-card-action-list li.unplanned .al-icon { color: var(--text-muted); }
1768
+ .drill-card-no-actions {
1769
+ font-size: 11px;
1770
+ color: var(--text-muted);
1771
+ font-style: italic;
1772
+ margin-top: 6px;
1773
+ }
1774
+
1775
+ /* Card-level status pill */
1776
+ .drill-status-pill {
1777
+ display: inline-block;
1778
+ padding: 3px 10px;
1779
+ border-radius: 99px;
1780
+ font-size: 11px;
1781
+ font-weight: 600;
1782
+ letter-spacing: 0.03em;
1783
+ text-transform: uppercase;
1784
+ background: rgba(255,255,255,0.04);
1785
+ border: 1px solid var(--border);
1786
+ color: var(--text-dim);
1787
+ }
1788
+ .drill-status-pill.s-done { background: var(--act-bg); border-color: var(--act-border); color: var(--act-color); }
1789
+ .drill-status-pill.s-executing { background: var(--executing-bg); border-color: var(--executing-border); color: var(--executing-color); }
1790
+ .drill-status-pill.s-planned { background: var(--planned-bg); border-color: var(--planned-border); color: var(--planned-color); }
1791
+ .drill-status-pill.s-pending { background: rgba(255,255,255,0.03); color: var(--text-dim); }
1792
+
1793
+ /* ── Card review actions (centered below content) ── */
1794
+ .drill-card-actions {
1795
+ display: flex;
1796
+ gap: 8px;
1797
+ padding-top: 8px;
1798
+ border-top: 1px solid var(--border);
1799
+ }
1800
+ .drill-review-btn {
1801
+ flex: 1;
1802
+ padding: 8px 14px;
1803
+ border-radius: var(--radius);
1804
+ font-size: 13px;
1805
+ font-weight: 600;
1806
+ cursor: pointer;
1807
+ border: 1px solid var(--border-strong);
1808
+ background: transparent;
1809
+ color: var(--text);
1810
+ transition: all 0.15s ease;
1811
+ text-align: center;
1812
+ }
1813
+ .drill-review-btn kbd, .drill-action-btn kbd {
1814
+ display: inline-block;
1815
+ padding: 0 5px;
1816
+ border: 1px solid var(--border-strong);
1817
+ border-radius: 3px;
1818
+ font-size: 10px;
1819
+ font-family: inherit;
1820
+ font-weight: 700;
1821
+ color: var(--text-dim);
1822
+ background: var(--surface2);
1823
+ margin-right: 2px;
1824
+ vertical-align: baseline;
1825
+ }
1826
+ .drill-review-btn:hover, .drill-action-btn:hover {
1827
+ background: var(--surface2);
1828
+ border-color: var(--border-strong);
1829
+ color: var(--text);
1830
+ }
1831
+ .drill-review-btn.approve-btn:hover {
1832
+ background: rgba(134, 239, 172, 0.08);
1833
+ border-color: rgba(134, 239, 172, 0.3);
1834
+ color: #86efac;
1835
+ }
1836
+
1837
+ /* ── Flat action bar buttons ── */
1838
+ .drill-action-btn {
1839
+ padding: 6px 12px;
1840
+ border-radius: var(--radius);
1841
+ font-size: 12px;
1842
+ font-weight: 500;
1843
+ cursor: pointer;
1844
+ border: 1px solid var(--border);
1845
+ background: transparent;
1846
+ color: var(--text-dim);
1847
+ transition: all 0.15s ease;
1848
+ }
1849
+ .drill-action-btn:hover {
1850
+ background: var(--surface2);
1851
+ border-color: var(--border-strong);
1852
+ color: var(--text);
1853
+ }
1854
+ .drill-action-btn.drill-action-primary {
1855
+ background: var(--accent-dim);
1856
+ border-color: var(--accent-border);
1857
+ color: var(--accent);
1858
+ font-weight: 600;
1859
+ }
1860
+ .drill-action-btn.drill-action-primary:hover {
1861
+ background: var(--accent-border);
1862
+ }
1863
+ .drill-action-btn.drill-action-danger {
1864
+ color: var(--text-dim);
1865
+ }
1866
+ .drill-action-btn.drill-action-danger:hover {
1867
+ background: rgba(248,113,113,0.08);
1868
+ border-color: rgba(248,113,113,0.3);
1869
+ color: #f87171;
1870
+ }
1871
+
1872
+ /* ── Refine suggestion inline area ── */
1873
+ .refine-area {
1874
+ margin-top: 8px;
1875
+ padding: 10px;
1876
+ border: 1px solid var(--accent-border);
1877
+ border-radius: var(--radius);
1878
+ background: rgba(208,236,26,0.03);
1879
+ font-size: 13px;
1880
+ line-height: 1.5;
1881
+ color: var(--text);
1882
+ }
1883
+ .refine-area .refine-streaming {
1884
+ white-space: pre-wrap;
1885
+ min-height: 24px;
1886
+ }
1887
+ .refine-area .refine-actions {
1888
+ display: flex;
1889
+ gap: 8px;
1890
+ margin-top: 8px;
1891
+ }
1892
+ .refine-area .refine-accept {
1893
+ padding: 5px 12px;
1894
+ border-radius: var(--radius);
1895
+ font-size: 12px;
1896
+ font-weight: 600;
1897
+ cursor: pointer;
1898
+ border: 1px solid rgba(134,239,172,0.3);
1899
+ background: rgba(134,239,172,0.08);
1900
+ color: #86efac;
1901
+ }
1902
+ .refine-area .refine-discard {
1903
+ padding: 5px 12px;
1904
+ border-radius: var(--radius);
1905
+ font-size: 12px;
1906
+ font-weight: 600;
1907
+ cursor: pointer;
1908
+ border: 1px solid var(--border-strong);
1909
+ background: transparent;
1910
+ color: var(--text-dim);
1911
+ }
1912
+ .refine-write-input {
1913
+ width: 100%;
1914
+ padding: 8px;
1915
+ border: 1px solid var(--border-strong);
1916
+ border-radius: var(--radius);
1917
+ background: var(--surface2);
1918
+ color: var(--text);
1919
+ font-size: 13px;
1920
+ font-family: inherit;
1921
+ resize: vertical;
1922
+ min-height: 40px;
1923
+ margin-bottom: 6px;
1924
+ }
1925
+ .refine-write-input:focus {
1926
+ outline: none;
1927
+ border-color: var(--accent-border);
1928
+ }
1929
+
1930
+ /* Expandable plan preview */
1931
+ .drill-plan-toggle {
1932
+ font-size: 11px;
1933
+ color: var(--text-muted);
1934
+ cursor: pointer;
1935
+ padding: 2px 0;
1936
+ user-select: none;
1937
+ font-weight: 500;
1938
+ transition: color 0.12s;
1939
+ }
1940
+ .drill-plan-toggle:hover { color: var(--text); }
1941
+ .drill-plan-content {
1942
+ display: none;
1943
+ margin-top: 6px;
1944
+ padding: 12px 14px;
1945
+ background: var(--bg);
1946
+ border: 1px solid var(--border);
1947
+ border-radius: var(--radius);
1948
+ font-size: 11px;
1949
+ line-height: 1.6;
1950
+ color: var(--text-dim);
1951
+ max-height: 200px;
1952
+ overflow-y: auto;
1953
+ }
1954
+ .drill-plan-content.open { display: block; }
1955
+
1956
+ /* ── Bottom prompt bar ── */
1957
+ #drill-prompt {
1958
+ padding: 14px 24px;
1959
+ background: var(--surface);
1960
+ border-top: 1px solid var(--border);
1961
+ display: flex;
1962
+ align-items: center;
1963
+ justify-content: center;
1964
+ gap: 12px;
1965
+ flex-shrink: 0;
1966
+ font-size: 13px;
1967
+ }
1968
+ .drill-prompt-text {
1969
+ color: var(--text);
1970
+ }
1971
+ .drill-prompt-text .drill-prompt-target {
1972
+ color: var(--accent);
1973
+ font-weight: 600;
1974
+ cursor: pointer;
1975
+ }
1976
+ .drill-prompt-text .drill-prompt-target:hover { text-decoration: underline; }
1977
+ .drill-prompt-complete {
1978
+ color: var(--accent);
1979
+ font-weight: 600;
1980
+ }
1981
+ /* Command card in agents panel */
1982
+ #command-card {
1983
+ background: var(--surface2);
1984
+ border: 1px solid var(--border);
1985
+ border-radius: 18px;
1986
+ padding: 8px 14px;
1987
+ cursor: default;
1988
+ transition: all 0.15s ease;
1989
+ margin-bottom: 4px;
1990
+ }
1991
+ #command-card:hover, #command-card:focus-within { border-color: var(--accent-border); }
1992
+ #command-card .cmd-label {
1993
+ display: none;
1994
+ }
1995
+ #command-card .cmd-key {
1996
+ display: none;
1997
+ }
1998
+ #command-card .cmd-row {
1999
+ display: flex;
2000
+ align-items: center;
2001
+ gap: 8px;
2002
+ }
2003
+ #command-card .cmd-shortcut {
2004
+ background: var(--surface3);
2005
+ border: 1px solid var(--border);
2006
+ border-radius: 4px;
2007
+ padding: 1px 6px;
2008
+ font-size: 10px;
2009
+ font-weight: 700;
2010
+ color: var(--text-dim);
2011
+ font-family: 'SF Mono', 'Fira Code', monospace;
2012
+ flex-shrink: 0;
2013
+ line-height: 1.6;
2014
+ }
2015
+ #command-card:focus-within .cmd-shortcut { display: none; }
2016
+ #command-card.editing {
2017
+ border-color: var(--accent);
2018
+ border-style: solid;
2019
+ cursor: default;
2020
+ }
2021
+ #command-card-input {
2022
+ display: block;
2023
+ width: 100%;
2024
+ background: transparent;
2025
+ border: none;
2026
+ color: var(--text);
2027
+ font-size: 13px;
2028
+ padding: 2px 0;
2029
+ outline: none;
2030
+ font-family: inherit;
2031
+ resize: none;
2032
+ line-height: 1.4;
2033
+ min-width: 0;
2034
+ flex: 1;
2035
+ }
2036
+ #command-card-hint {
2037
+ display: none;
2038
+ font-size: 10px;
2039
+ color: var(--text-dim);
2040
+ margin-top: 4px;
2041
+ }
2042
+ #command-card.editing #command-card-hint { display: block; }
2043
+ #command-card.running { border-color: var(--executing-color); border-style: solid; }
2044
+ #command-card.running .cmd-label { display: none; }
2045
+ #command-card.running #command-card-input { display: none; }
2046
+ #command-card.running #command-card-hint { display: none; }
2047
+ .command-output-stream {
2048
+ font-family: 'SF Mono', 'Fira Code', monospace;
2049
+ font-size: 11px;
2050
+ line-height: 1.5;
2051
+ color: var(--text-muted);
2052
+ max-height: 200px;
2053
+ overflow-y: auto;
2054
+ white-space: pre-wrap;
2055
+ word-break: break-word;
2056
+ margin: 0;
2057
+ padding: 0;
2058
+ }
2059
+ .command-output-stream.streaming { color: var(--executing-color); }
2060
+ .drill-next-btn {
2061
+ background: var(--accent-dim);
2062
+ border: 1px solid var(--accent-border);
2063
+ color: var(--accent);
2064
+ padding: 6px 16px;
2065
+ border-radius: var(--radius);
2066
+ cursor: pointer;
2067
+ font-size: 13px;
2068
+ font-weight: 600;
2069
+ margin-left: 12px;
2070
+ transition: all 0.15s ease;
2071
+ }
2072
+ .drill-next-btn:hover { background: rgba(208, 236, 26, 0.18); }
2073
+ .drill-next-btn kbd {
2074
+ display: inline-block;
2075
+ padding: 0 5px;
2076
+ border: 1px solid var(--accent-border);
2077
+ border-radius: 3px;
2078
+ font-size: 10px;
2079
+ font-family: inherit;
2080
+ font-weight: 700;
2081
+ color: var(--accent);
2082
+ background: rgba(208, 236, 26, 0.08);
2083
+ margin-right: 2px;
2084
+ }
2085
+ .drill-approve-all-btn {
2086
+ background: rgba(134, 239, 172, 0.08);
2087
+ border: 1px solid rgba(134, 239, 172, 0.3);
2088
+ color: #86efac;
2089
+ padding: 6px 16px;
2090
+ border-radius: var(--radius);
2091
+ cursor: pointer;
2092
+ font-size: 13px;
2093
+ font-weight: 600;
2094
+ margin-left: 12px;
2095
+ transition: all 0.15s ease;
2096
+ }
2097
+ .drill-approve-all-btn:hover { background: rgba(134, 239, 172, 0.15); }
2098
+ .drill-approve-all-btn kbd {
2099
+ display: inline-block;
2100
+ padding: 0 5px;
2101
+ border: 1px solid rgba(134, 239, 172, 0.3);
2102
+ border-radius: 3px;
2103
+ font-size: 10px;
2104
+ font-family: inherit;
2105
+ font-weight: 700;
2106
+ color: #86efac;
2107
+ background: rgba(134, 239, 172, 0.08);
2108
+ margin-right: 2px;
2109
+ }
2110
+
2111
+ .col-empty {
2112
+ padding: 40px 20px;
2113
+ color: var(--text-muted);
2114
+ font-size: 13px;
2115
+ text-align: center;
2116
+ }
2117
+
2118
+ .col-empty-invite {
2119
+ padding: 60px 32px;
2120
+ text-align: center;
2121
+ display: flex;
2122
+ flex-direction: column;
2123
+ align-items: center;
2124
+ gap: 12px;
2125
+ }
2126
+ .empty-invite-title {
2127
+ color: var(--text);
2128
+ font-size: 15px;
2129
+ font-weight: 600;
2130
+ }
2131
+ .empty-invite-desc {
2132
+ color: var(--text-muted);
2133
+ font-size: 13px;
2134
+ max-width: 320px;
2135
+ line-height: 1.5;
2136
+ }
2137
+ .empty-invite-input {
2138
+ width: 100%;
2139
+ max-width: 320px;
2140
+ background: var(--surface2);
2141
+ border: 1px solid var(--border);
2142
+ border-radius: 6px;
2143
+ color: var(--text);
2144
+ font-size: 12px;
2145
+ padding: 8px 10px;
2146
+ resize: vertical;
2147
+ font-family: inherit;
2148
+ }
2149
+ .empty-invite-input:focus {
2150
+ outline: none;
2151
+ border-color: var(--accent-border);
2152
+ }
2153
+ .empty-invite-input::placeholder {
2154
+ color: var(--text-muted);
2155
+ opacity: 0.6;
2156
+ }
2157
+ .empty-invite-btn {
2158
+ background: var(--accent-dim);
2159
+ border: 1px solid var(--accent-border);
2160
+ color: var(--accent);
2161
+ padding: 8px 20px;
2162
+ border-radius: 6px;
2163
+ font-size: 13px;
2164
+ font-weight: 600;
2165
+ cursor: pointer;
2166
+ transition: all 0.15s ease;
2167
+ }
2168
+ .empty-invite-btn:hover {
2169
+ background: rgba(208, 236, 26, 0.18);
2170
+ border-color: rgba(208, 236, 26, 0.4);
2171
+ }
2172
+ .empty-invite-btn kbd {
2173
+ background: rgba(255,255,255,0.08);
2174
+ border: 1px solid rgba(255,255,255,0.12);
2175
+ border-radius: 3px;
2176
+ padding: 1px 5px;
2177
+ font-size: 11px;
2178
+ margin-right: 4px;
2179
+ }
2180
+ .col-empty-invite .output-log {
2181
+ width: 100%;
2182
+ max-width: 560px;
2183
+ text-align: left;
2184
+ max-height: 200px;
2185
+ overflow-y: auto;
2186
+ font-size: 12px;
2187
+ line-height: 1.6;
2188
+ color: var(--text-dim);
2189
+ padding: 12px 16px;
2190
+ border-radius: var(--radius);
2191
+ background: var(--surface);
2192
+ border: 1px solid var(--border);
2193
+ }
2194
+ .col-empty-invite .output-log .derive-log-line {
2195
+ opacity: 0.5;
2196
+ transition: opacity 0.3s;
2197
+ }
2198
+ .col-empty-invite .output-log .derive-log-line:last-child {
2199
+ opacity: 1;
2200
+ color: var(--text);
2201
+ }
2202
+ .col-empty-invite .derivation-checklist {
2203
+ text-align: left;
2204
+ width: 100%;
2205
+ max-width: 560px;
2206
+ }
2207
+ .col-empty-invite #derivation-proposals {
2208
+ width: 100%;
2209
+ max-width: 560px;
2210
+ text-align: left;
2211
+ }
2212
+ .derivation-progress {
2213
+ width: 100%;
2214
+ max-width: 560px;
2215
+ margin-top: 16px;
2216
+ padding: 14px 18px;
2217
+ background: var(--surface);
2218
+ border: 1px solid var(--border);
2219
+ border-radius: var(--radius-lg);
2220
+ }
2221
+ .derive-phase {
2222
+ display: flex;
2223
+ align-items: center;
2224
+ gap: 10px;
2225
+ animation: derive-phase-in 0.4s ease;
2226
+ }
2227
+ .derive-phase-icon {
2228
+ font-size: 18px;
2229
+ flex-shrink: 0;
2230
+ }
2231
+ .derive-phase-text {
2232
+ font-size: 13px;
2233
+ color: var(--text);
2234
+ font-weight: 500;
2235
+ }
2236
+ @keyframes derive-phase-in {
2237
+ from { opacity: 0; transform: translateY(4px); }
2238
+ to { opacity: 1; transform: translateY(0); }
2239
+ }
2240
+ .derive-stream-output {
2241
+ margin-top: 10px;
2242
+ padding: 10px 12px;
2243
+ background: var(--bg);
2244
+ border: 1px solid var(--border);
2245
+ border-radius: var(--radius);
2246
+ font-size: 12px;
2247
+ line-height: 1.5;
2248
+ color: var(--text-dim);
2249
+ max-height: 160px;
2250
+ overflow-y: auto;
2251
+ white-space: pre-wrap;
2252
+ word-break: break-word;
2253
+ font-family: 'SF Mono', 'Fira Code', monospace;
2254
+ }
2255
+
2256
+ .derive-spinner {
2257
+ display: inline-block;
2258
+ width: 12px;
2259
+ height: 12px;
2260
+ border: 2px solid rgba(208,236,26,0.3);
2261
+ border-top-color: var(--accent);
2262
+ border-radius: 50%;
2263
+ animation: derive-spin 0.8s linear infinite;
2264
+ vertical-align: middle;
2265
+ margin-right: 4px;
2266
+ }
2267
+ @keyframes derive-spin {
2268
+ to { transform: rotate(360deg); }
2269
+ }
2270
+ .derive-elapsed {
2271
+ opacity: 0.5;
2272
+ font-size: 11px;
2273
+ font-weight: 400;
2274
+ }
2275
+
2276
+ /* Hide side panel in drill browser mode */
2277
+ body:not(.dag-mode) #side-panel { display: none; }
2278
+ body.dag-mode #side-panel { display: flex; }
2279
+ body.dag-mode #activity-feed { display: none; }
2280
+
2281
+ /* ── Declaration form ── */
2282
+ .decl-form-trigger {
2283
+ background: none;
2284
+ border: 1px solid var(--decl-border);
2285
+ color: var(--decl-color);
2286
+ width: 22px;
2287
+ height: 22px;
2288
+ border-radius: 4px;
2289
+ cursor: pointer;
2290
+ font-size: 14px;
2291
+ line-height: 1;
2292
+ display: inline-flex;
2293
+ align-items: center;
2294
+ justify-content: center;
2295
+ transition: background 0.15s, border-color 0.15s;
2296
+ flex-shrink: 0;
2297
+ margin-left: auto;
2298
+ }
2299
+ .decl-form-trigger:hover {
2300
+ background: var(--decl-bg);
2301
+ border-color: var(--decl-color);
2302
+ }
2303
+
2304
+ .decl-form-overlay {
2305
+ padding: 12px 16px;
2306
+ border-bottom: 1px solid var(--border);
2307
+ background: var(--surface2);
2308
+ }
2309
+
2310
+ .decl-form {
2311
+ display: flex;
2312
+ flex-direction: column;
2313
+ gap: 8px;
2314
+ }
2315
+
2316
+ .decl-form input,
2317
+ .decl-form textarea {
2318
+ background: var(--surface);
2319
+ border: 1px solid var(--border);
2320
+ color: var(--text);
2321
+ border-radius: 4px;
2322
+ padding: 8px 12px;
2323
+ width: 100%;
2324
+ font-size: 13px;
2325
+ font-family: inherit;
2326
+ outline: none;
2327
+ transition: border-color 0.15s;
2328
+ }
2329
+ .decl-form input:focus,
2330
+ .decl-form textarea:focus {
2331
+ border-color: var(--decl-color);
2332
+ }
2333
+
2334
+ .decl-form textarea {
2335
+ resize: vertical;
2336
+ min-height: 54px;
2337
+ }
2338
+
2339
+ .decl-form-actions {
2340
+ display: flex;
2341
+ gap: 8px;
2342
+ align-items: center;
2343
+ }
2344
+
2345
+ .decl-form-actions .decl-submit-btn {
2346
+ background: var(--decl-color);
2347
+ color: #fff;
2348
+ border: none;
2349
+ border-radius: 4px;
2350
+ padding: 6px 16px;
2351
+ cursor: pointer;
2352
+ font-size: 12px;
2353
+ font-weight: 600;
2354
+ transition: opacity 0.15s;
2355
+ }
2356
+ .decl-form-actions .decl-submit-btn:hover { opacity: 0.9; }
2357
+ .decl-form-actions .decl-submit-btn:disabled {
2358
+ opacity: 0.5;
2359
+ cursor: not-allowed;
2360
+ }
2361
+
2362
+ .decl-form-actions .decl-cancel-btn {
2363
+ background: transparent;
2364
+ border: 1px solid var(--border);
2365
+ color: var(--text-dim);
2366
+ border-radius: 4px;
2367
+ padding: 6px 16px;
2368
+ cursor: pointer;
2369
+ font-size: 12px;
2370
+ transition: border-color 0.15s, color 0.15s;
2371
+ }
2372
+ .decl-form-actions .decl-cancel-btn:hover {
2373
+ border-color: var(--text-dim);
2374
+ color: var(--text);
2375
+ }
2376
+
2377
+ .decl-form .form-error {
2378
+ color: var(--broken-color);
2379
+ font-size: 12px;
2380
+ margin-top: 4px;
2381
+ min-height: 0;
2382
+ }
2383
+
2384
+ /* Status bar new-decl button */
2385
+ .new-decl-btn {
2386
+ background: var(--decl-bg);
2387
+ border: 1px solid var(--decl-border);
2388
+ color: var(--decl-color);
2389
+ padding: 5px 14px;
2390
+ border-radius: 6px;
2391
+ cursor: pointer;
2392
+ font-size: 12px;
2393
+ font-weight: 600;
2394
+ transition: background 0.15s, border-color 0.15s;
2395
+ }
2396
+ .new-decl-btn:hover { background: #0f2d50; border-color: var(--decl-color); }
2397
+
2398
+ /* Play All button */
2399
+ .play-btn {
2400
+ background: #0a2018;
2401
+ border: 1px solid var(--act-border);
2402
+ color: var(--act-color);
2403
+ padding: 5px 14px;
2404
+ border-radius: 6px;
2405
+ cursor: pointer;
2406
+ font-size: 12px;
2407
+ font-weight: 600;
2408
+ transition: background 0.15s, border-color 0.15s;
2409
+ }
2410
+ .play-btn:hover { background: #0f3020; border-color: var(--act-color); }
2411
+ .play-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2412
+ .play-btn.playing {
2413
+ background: var(--executing-bg);
2414
+ border-color: var(--executing-border);
2415
+ color: var(--executing-color);
2416
+ animation: pulse-play 1.5s ease-in-out infinite;
2417
+ }
2418
+ @keyframes pulse-play {
2419
+ 0%, 100% { opacity: 1; }
2420
+ 50% { opacity: 0.7; }
2421
+ }
2422
+
2423
+ /* Play progress banner */
2424
+ #play-banner {
2425
+ display: none;
2426
+ background: var(--surface);
2427
+ border-bottom: 1px solid var(--executing-border);
2428
+ padding: 8px 20px;
2429
+ font-size: 12px;
2430
+ color: var(--text);
2431
+ align-items: center;
2432
+ gap: 12px;
2433
+ flex-shrink: 0;
2434
+ }
2435
+ #play-banner.visible { display: flex; }
2436
+ #play-banner .play-wave-label {
2437
+ color: var(--executing-color);
2438
+ font-weight: 600;
2439
+ }
2440
+ #play-banner .play-actions-list {
2441
+ display: flex;
2442
+ gap: 6px;
2443
+ flex-wrap: wrap;
2444
+ }
2445
+ #play-banner .play-action-tag {
2446
+ background: var(--surface2);
2447
+ border: 1px solid var(--border);
2448
+ border-radius: 4px;
2449
+ padding: 2px 8px;
2450
+ font-size: 11px;
2451
+ }
2452
+ #play-banner .play-action-tag.active {
2453
+ border-color: var(--executing-border);
2454
+ color: var(--executing-color);
2455
+ }
2456
+ #play-banner .play-action-tag.done {
2457
+ border-color: var(--act-border);
2458
+ color: var(--act-color);
2459
+ }
2460
+ #play-banner .play-action-tag.failed {
2461
+ border-color: var(--broken-border);
2462
+ color: var(--broken-color);
2463
+ }
2464
+ .play-stop-btn {
2465
+ background: var(--broken-bg);
2466
+ border: 1px solid var(--broken-border);
2467
+ color: var(--broken-color);
2468
+ padding: 3px 10px;
2469
+ border-radius: 4px;
2470
+ cursor: pointer;
2471
+ font-size: 11px;
2472
+ margin-left: auto;
2473
+ }
2474
+ .play-stop-btn:hover { background: #3a0a10; }
2475
+
2476
+ /* Scrollbar for column panels */
2477
+ .col-panel::-webkit-scrollbar { width: 4px; }
2478
+ .col-panel::-webkit-scrollbar-track { background: transparent; }
2479
+ .col-panel::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
2480
+
2481
+ /* ── File Viewer Modal ── */
2482
+ #file-viewer-modal {
2483
+ display: none;
2484
+ position: fixed;
2485
+ inset: 0;
2486
+ z-index: 2000;
2487
+ background: rgba(0, 0, 0, 0.75);
2488
+ backdrop-filter: blur(4px);
2489
+ justify-content: center;
2490
+ align-items: center;
2491
+ padding: 40px;
2492
+ }
2493
+ #file-viewer-modal.open {
2494
+ display: flex;
2495
+ }
2496
+ .file-viewer-container {
2497
+ background: var(--surface);
2498
+ border: 1px solid var(--border);
2499
+ border-radius: 12px;
2500
+ width: 100%;
2501
+ max-width: 820px;
2502
+ max-height: 85vh;
2503
+ display: flex;
2504
+ flex-direction: column;
2505
+ overflow: hidden;
2506
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2507
+ }
2508
+ .file-viewer-header {
2509
+ display: flex;
2510
+ align-items: center;
2511
+ justify-content: space-between;
2512
+ padding: 12px 16px;
2513
+ border-bottom: 1px solid var(--border);
2514
+ background: var(--surface2);
2515
+ flex-shrink: 0;
2516
+ }
2517
+ .file-viewer-path {
2518
+ font-family: 'SF Mono', 'Fira Code', monospace;
2519
+ font-size: 12px;
2520
+ color: var(--text-bright);
2521
+ font-weight: 600;
2522
+ overflow: hidden;
2523
+ text-overflow: ellipsis;
2524
+ white-space: nowrap;
2525
+ }
2526
+ .file-viewer-close {
2527
+ background: none;
2528
+ border: 1px solid var(--border);
2529
+ color: var(--text-dim);
2530
+ cursor: pointer;
2531
+ border-radius: 6px;
2532
+ width: 28px;
2533
+ height: 28px;
2534
+ display: flex;
2535
+ align-items: center;
2536
+ justify-content: center;
2537
+ font-size: 14px;
2538
+ flex-shrink: 0;
2539
+ margin-left: 12px;
2540
+ }
2541
+ .file-viewer-close:hover {
2542
+ color: var(--text-bright);
2543
+ border-color: var(--text-dim);
2544
+ }
2545
+ .file-viewer-body {
2546
+ overflow-y: auto;
2547
+ padding: 20px 24px;
2548
+ flex: 1;
2549
+ font-size: 13px;
2550
+ line-height: 1.65;
2551
+ color: var(--text);
2552
+ }
2553
+ /* Markdown rendered content */
2554
+ .file-viewer-body.markdown h1 { font-size: 1.6em; font-weight: 700; color: var(--text-bright); margin: 0 0 0.6em; padding-bottom: 0.3em; border-bottom: 1px solid var(--border); }
2555
+ .file-viewer-body.markdown h2 { font-size: 1.3em; font-weight: 700; color: var(--text-bright); margin: 1.2em 0 0.4em; padding-bottom: 0.25em; border-bottom: 1px solid var(--border); }
2556
+ .file-viewer-body.markdown h3 { font-size: 1.1em; font-weight: 700; color: var(--text-bright); margin: 1em 0 0.3em; }
2557
+ .file-viewer-body.markdown h4, .file-viewer-body.markdown h5, .file-viewer-body.markdown h6 { font-size: 1em; font-weight: 700; color: var(--text-bright); margin: 0.8em 0 0.2em; }
2558
+ .file-viewer-body.markdown p { margin: 0 0 0.8em; }
2559
+ .file-viewer-body.markdown ul, .file-viewer-body.markdown ol { margin: 0 0 0.8em; padding-left: 1.5em; }
2560
+ .file-viewer-body.markdown li { margin-bottom: 0.3em; }
2561
+ .file-viewer-body.markdown li > ul, .file-viewer-body.markdown li > ol { margin-top: 0.3em; margin-bottom: 0; }
2562
+ .file-viewer-body.markdown code { font-family: 'SF Mono', 'Fira Code', monospace; background: var(--surface2); border: 1px solid var(--border); border-radius: 3px; padding: 1px 5px; font-size: 0.9em; color: var(--act-color); }
2563
+ .file-viewer-body.markdown pre { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; overflow-x: auto; margin: 0 0 1em; }
2564
+ .file-viewer-body.markdown pre code { background: none; border: none; padding: 0; color: var(--text); font-size: 12px; line-height: 1.5; }
2565
+ .file-viewer-body.markdown blockquote { border-left: 3px solid var(--border); padding: 0.2em 0 0.2em 1em; margin: 0 0 0.8em; color: var(--text-dim); }
2566
+ .file-viewer-body.markdown a { color: var(--decl-color); text-decoration: none; }
2567
+ .file-viewer-body.markdown a:hover { text-decoration: underline; }
2568
+ .file-viewer-body.markdown hr { border: none; border-top: 1px solid var(--border); margin: 1.2em 0; }
2569
+ .file-viewer-body.markdown table { border-collapse: collapse; margin: 0 0 1em; width: 100%; }
2570
+ .file-viewer-body.markdown th, .file-viewer-body.markdown td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; font-size: 12px; }
2571
+ .file-viewer-body.markdown th { background: var(--surface2); font-weight: 700; color: var(--text-bright); }
2572
+ .file-viewer-body.markdown img { max-width: 100%; }
2573
+ .file-viewer-body.markdown strong { color: var(--text-bright); font-weight: 700; }
2574
+ /* Preformatted (non-markdown) */
2575
+ .file-viewer-body.preformatted {
2576
+ font-family: 'SF Mono', 'Fira Code', monospace;
2577
+ font-size: 12px;
2578
+ line-height: 1.5;
2579
+ white-space: pre-wrap;
2580
+ word-break: break-all;
2581
+ color: var(--text);
2582
+ }
2583
+ /* Clickable file links in plan detail */
2584
+ .file-link {
2585
+ cursor: pointer;
2586
+ transition: border-color 0.15s;
2587
+ }
2588
+ .file-link:hover {
2589
+ border-color: var(--act-color) !important;
2590
+ text-decoration: underline;
2591
+ }
2592
+
2593
+ /* ── Declaration edit mode ── */
2594
+ .decl-edit-mode input,
2595
+ .decl-edit-mode textarea {
2596
+ background: var(--surface);
2597
+ border: 1px solid var(--border);
2598
+ color: var(--text);
2599
+ border-radius: 4px;
2600
+ padding: 8px 12px;
2601
+ width: 100%;
2602
+ font-size: 13px;
2603
+ font-family: inherit;
2604
+ outline: none;
2605
+ transition: border-color 0.15s;
2606
+ }
2607
+ .decl-edit-mode input:focus,
2608
+ .decl-edit-mode textarea:focus {
2609
+ border-color: var(--decl-color);
2610
+ }
2611
+ .decl-edit-mode textarea {
2612
+ resize: vertical;
2613
+ min-height: 54px;
2614
+ }
2615
+ .decl-edit-mode label {
2616
+ font-size: 10px;
2617
+ font-weight: 700;
2618
+ letter-spacing: 0.1em;
2619
+ text-transform: uppercase;
2620
+ color: var(--text-dim);
2621
+ margin-bottom: 4px;
2622
+ margin-top: 12px;
2623
+ display: block;
2624
+ }
2625
+ .decl-edit-mode label:first-child {
2626
+ margin-top: 0;
2627
+ }
2628
+
2629
+ .decl-edit-actions {
2630
+ display: flex;
2631
+ gap: 8px;
2632
+ align-items: center;
2633
+ margin-top: 14px;
2634
+ }
2635
+ .decl-edit-actions .btn-save {
2636
+ background: var(--decl-color);
2637
+ color: #fff;
2638
+ border: none;
2639
+ border-radius: 4px;
2640
+ padding: 6px 16px;
2641
+ cursor: pointer;
2642
+ font-size: 12px;
2643
+ font-weight: 600;
2644
+ transition: opacity 0.15s;
2645
+ }
2646
+ .decl-edit-actions .btn-save:hover { opacity: 0.9; }
2647
+ .decl-edit-actions .btn-save:disabled { opacity: 0.5; cursor: not-allowed; }
2648
+ .decl-edit-actions .btn-cancel {
2649
+ background: transparent;
2650
+ border: 1px solid var(--border);
2651
+ color: var(--text-dim);
2652
+ border-radius: 4px;
2653
+ padding: 6px 16px;
2654
+ cursor: pointer;
2655
+ font-size: 12px;
2656
+ transition: border-color 0.15s, color 0.15s;
2657
+ }
2658
+ .decl-edit-actions .btn-cancel:hover { border-color: var(--text-dim); color: var(--text); }
2659
+
2660
+ .delete-confirm {
2661
+ margin-top: 12px;
2662
+ padding: 10px 12px;
2663
+ background: var(--broken-bg);
2664
+ border: 1px solid var(--broken-border);
2665
+ border-radius: 6px;
2666
+ font-size: 12px;
2667
+ color: var(--broken-color);
2668
+ }
2669
+ .delete-confirm p {
2670
+ margin-bottom: 8px;
2671
+ }
2672
+ .delete-confirm .delete-confirm-actions {
2673
+ display: flex;
2674
+ gap: 8px;
2675
+ }
2676
+ .delete-confirm .btn-confirm-delete {
2677
+ background: var(--broken-color);
2678
+ color: #fff;
2679
+ border: none;
2680
+ border-radius: 4px;
2681
+ padding: 5px 14px;
2682
+ cursor: pointer;
2683
+ font-size: 12px;
2684
+ font-weight: 600;
2685
+ }
2686
+ .delete-confirm .btn-confirm-cancel {
2687
+ background: transparent;
2688
+ border: 1px solid var(--broken-border);
2689
+ color: var(--broken-color);
2690
+ border-radius: 4px;
2691
+ padding: 5px 14px;
2692
+ cursor: pointer;
2693
+ font-size: 12px;
2694
+ }
2695
+
2696
+ .decl-status-select {
2697
+ background: var(--surface2);
2698
+ color: var(--text);
2699
+ border: 1px solid var(--border);
2700
+ border-radius: 4px;
2701
+ padding: 8px 12px;
2702
+ width: 100%;
2703
+ font-size: 13px;
2704
+ font-family: inherit;
2705
+ outline: none;
2706
+ cursor: pointer;
2707
+ transition: border-color 0.15s;
2708
+ }
2709
+ .decl-status-select:focus {
2710
+ border-color: var(--decl-color);
2711
+ }
2712
+
2713
+ .decl-panel-actions {
2714
+ display: flex;
2715
+ gap: 8px;
2716
+ margin-top: 16px;
2717
+ }
2718
+ .decl-panel-actions .btn-edit {
2719
+ background: var(--decl-bg);
2720
+ border: 1px solid var(--decl-border);
2721
+ color: var(--decl-color);
2722
+ border-radius: 4px;
2723
+ padding: 5px 14px;
2724
+ cursor: pointer;
2725
+ font-size: 12px;
2726
+ font-weight: 600;
2727
+ transition: background 0.15s, border-color 0.15s;
2728
+ }
2729
+ .decl-panel-actions .btn-edit:hover { background: #0f2d50; border-color: var(--decl-color); }
2730
+ .decl-panel-actions .btn-panel-delete {
2731
+ background: transparent;
2732
+ color: var(--broken-color);
2733
+ border: 1px solid var(--broken-border);
2734
+ border-radius: 4px;
2735
+ padding: 5px 14px;
2736
+ cursor: pointer;
2737
+ font-size: 12px;
2738
+ font-weight: 600;
2739
+ transition: background 0.15s;
2740
+ }
2741
+ .decl-panel-actions .btn-panel-delete:hover { background: var(--broken-bg); }
2742
+
2743
+ /* Workability path section */
2744
+ .workability-path { margin-top: 4px; }
2745
+ .workability-path .wp-header {
2746
+ font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
2747
+ text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px;
2748
+ }
2749
+ .wp-step {
2750
+ display: flex; align-items: flex-start; gap: 10px;
2751
+ padding: 8px 10px; border-radius: 6px;
2752
+ background: var(--surface2); border: 1px solid var(--border);
2753
+ margin-bottom: 6px; font-size: 12px;
2754
+ }
2755
+ .wp-step-action {
2756
+ font-size: 10px; font-weight: 700; letter-spacing: 0.04em;
2757
+ color: var(--act-color); cursor: pointer; white-space: nowrap;
2758
+ flex-shrink: 0;
2759
+ }
2760
+ .wp-step-action:hover { text-decoration: underline; }
2761
+ .wp-step-body { flex: 1; min-width: 0; }
2762
+ .wp-step-title {
2763
+ color: var(--text-bright); font-size: 12px; font-weight: 500;
2764
+ line-height: 1.35; margin-bottom: 3px;
2765
+ }
2766
+ .wp-step-milestone {
2767
+ font-size: 10px; color: var(--text-dim); opacity: 0.7;
2768
+ }
2769
+ .wp-impact {
2770
+ display: inline-block; padding: 1px 7px; border-radius: 8px;
2771
+ font-size: 9px; font-weight: 700; letter-spacing: 0.04em;
2772
+ text-transform: uppercase; flex-shrink: 0; margin-top: 1px;
2773
+ }
2774
+ .wp-impact.impact-high { background: #2a0a10; color: var(--broken-color); border: 1px solid #5a1520; }
2775
+ .wp-impact.impact-medium { background: #1a1200; color: var(--integrity-partial); border: 1px solid #3d2c00; }
2776
+ .wp-impact.impact-low { background: #0a2018; color: var(--integrity-whole); border: 1px solid #1a4d34; }
2777
+
2778
+ /* ── Derivation panel ── */
2779
+ .derivation-panel {
2780
+ margin-top: 12px;
2781
+ border: 1px solid var(--border);
2782
+ border-radius: 6px;
2783
+ padding: 12px;
2784
+ background: var(--bg);
2785
+ }
2786
+ .derivation-panel .output-log {
2787
+ max-height: 200px;
2788
+ overflow-y: auto;
2789
+ font-family: 'SF Mono', Monaco, monospace;
2790
+ font-size: 11px;
2791
+ padding: 8px;
2792
+ background: #1a1a2e;
2793
+ color: #ccc;
2794
+ border-radius: 4px;
2795
+ white-space: pre-wrap;
2796
+ margin-bottom: 12px;
2797
+ }
2798
+ .derivation-checklist { list-style: none; padding: 0; margin: 8px 0; }
2799
+ .derivation-checklist li {
2800
+ display: flex;
2801
+ align-items: center;
2802
+ gap: 8px;
2803
+ padding: 6px 0;
2804
+ border-bottom: 1px solid var(--border);
2805
+ }
2806
+ .derivation-checklist li:last-child { border-bottom: none; }
2807
+ .derivation-checklist input[type="checkbox"] { flex-shrink: 0; }
2808
+ .derivation-checklist input[type="text"] {
2809
+ flex: 1;
2810
+ background: var(--bg);
2811
+ color: var(--fg, var(--text));
2812
+ border: 1px solid var(--border);
2813
+ border-radius: 3px;
2814
+ padding: 4px 6px;
2815
+ font-size: 13px;
2816
+ }
2817
+ .derivation-checklist .reason {
2818
+ font-size: 11px;
2819
+ color: #888;
2820
+ margin-left: 28px;
2821
+ display: block;
2822
+ }
2823
+ .derive-btn {
2824
+ background: var(--accent, #4a6cf7);
2825
+ color: #fff;
2826
+ border: none;
2827
+ padding: 6px 14px;
2828
+ border-radius: 4px;
2829
+ cursor: pointer;
2830
+ font-size: 13px;
2831
+ }
2832
+ .derive-btn:hover { opacity: 0.85; }
2833
+ .derive-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2834
+ .derive-accept-btn {
2835
+ background: #2ea043;
2836
+ color: #fff;
2837
+ border: none;
2838
+ padding: 6px 14px;
2839
+ border-radius: 4px;
2840
+ cursor: pointer;
2841
+ font-size: 13px;
2842
+ margin-right: 8px;
2843
+ }
2844
+ .derive-cancel-btn {
2845
+ background: transparent;
2846
+ color: var(--text);
2847
+ border: 1px solid var(--border);
2848
+ padding: 6px 14px;
2849
+ border-radius: 4px;
2850
+ cursor: pointer;
2851
+ font-size: 13px;
2852
+ }
2853
+
2854
+ /* ── Workflow next-step banner ── */
2855
+ #workflow-banner {
2856
+ display: none;
2857
+ align-items: center;
2858
+ gap: 16px;
2859
+ padding: 12px 20px;
2860
+ background: var(--surface);
2861
+ border-bottom: 1px solid var(--border);
2862
+ flex-shrink: 0;
2863
+ }
2864
+ #workflow-banner.visible { display: flex; }
2865
+
2866
+ .wf-progress-bar {
2867
+ width: 120px;
2868
+ height: 6px;
2869
+ background: rgba(255,255,255,0.06);
2870
+ border-radius: 3px;
2871
+ overflow: hidden;
2872
+ flex-shrink: 0;
2873
+ }
2874
+ .wf-progress-fill {
2875
+ height: 100%;
2876
+ border-radius: 3px;
2877
+ background: var(--act-color);
2878
+ transition: width 0.4s ease;
2879
+ }
2880
+ .wf-progress-fill.state-empty { background: var(--text-dim); }
2881
+ .wf-progress-fill.state-declarations_only { background: var(--decl-color); }
2882
+ .wf-progress-fill.state-milestones_pending { background: var(--mile-color); }
2883
+ .wf-progress-fill.state-actions_pending { background: var(--act-color); }
2884
+ .wf-progress-fill.state-executing { background: var(--executing-color); }
2885
+ .wf-progress-fill.state-complete { background: var(--integrity-whole); }
2886
+
2887
+ .wf-state-label {
2888
+ font-size: 10px;
2889
+ font-weight: 700;
2890
+ letter-spacing: 0.08em;
2891
+ text-transform: uppercase;
2892
+ color: var(--text-dim);
2893
+ flex-shrink: 0;
2894
+ }
2895
+
2896
+ .wf-next-label {
2897
+ font-size: 13px;
2898
+ color: var(--text);
2899
+ flex: 1;
2900
+ }
2901
+
2902
+ .wf-action-btn {
2903
+ background: var(--act-bg);
2904
+ border: 1px solid var(--act-border);
2905
+ color: var(--act-color);
2906
+ padding: 6px 16px;
2907
+ border-radius: 6px;
2908
+ font-size: 12px;
2909
+ font-weight: 600;
2910
+ cursor: pointer;
2911
+ flex-shrink: 0;
2912
+ transition: background 0.15s, border-color 0.15s;
2913
+ white-space: nowrap;
2914
+ }
2915
+ .wf-action-btn:hover { background: #0d2818; border-color: #2a6a48; }
2916
+
2917
+ .wf-action-btn.state-empty,
2918
+ .wf-action-btn.state-declarations_only {
2919
+ background: var(--decl-bg);
2920
+ border-color: var(--decl-border);
2921
+ color: var(--decl-color);
2922
+ }
2923
+ .wf-action-btn.state-empty:hover,
2924
+ .wf-action-btn.state-declarations_only:hover {
2925
+ background: #0f2d50;
2926
+ border-color: var(--decl-color);
2927
+ }
2928
+ .wf-action-btn.state-milestones_pending {
2929
+ background: var(--mile-bg);
2930
+ border-color: var(--mile-border);
2931
+ color: var(--mile-color);
2932
+ }
2933
+ .wf-action-btn.state-milestones_pending:hover {
2934
+ background: #220e44;
2935
+ border-color: var(--mile-color);
2936
+ }
2937
+ .wf-action-btn.state-executing {
2938
+ background: var(--executing-bg);
2939
+ border-color: var(--executing-border);
2940
+ color: var(--executing-color);
2941
+ }
2942
+ .wf-action-btn.state-complete {
2943
+ background: #0a2018;
2944
+ border-color: #1a4d34;
2945
+ color: var(--integrity-whole);
2946
+ }
2947
+
2948
+ .wf-pct {
2949
+ font-size: 12px;
2950
+ font-weight: 600;
2951
+ color: var(--text-dim);
2952
+ flex-shrink: 0;
2953
+ }
2954
+
2955
+ /* ── Reference badges ── */
2956
+ .ref-link-badge {
2957
+ display: inline-block;
2958
+ padding: 3px 10px;
2959
+ border-radius: 6px;
2960
+ font-size: 11px;
2961
+ font-weight: 500;
2962
+ text-decoration: none;
2963
+ transition: border-color 0.12s, color 0.12s;
2964
+ max-width: 100%;
2965
+ overflow: hidden;
2966
+ text-overflow: ellipsis;
2967
+ white-space: nowrap;
2968
+ }
2969
+ .ref-url-badge {
2970
+ background: var(--decl-bg);
2971
+ border: 1px solid var(--decl-border);
2972
+ color: var(--decl-color);
2973
+ cursor: pointer;
2974
+ }
2975
+ .ref-url-badge:hover { border-color: var(--decl-color); text-decoration: underline; }
2976
+ .ref-path-badge {
2977
+ background: var(--surface2);
2978
+ border: 1px solid var(--border);
2979
+ color: var(--text-dim);
2980
+ font-family: 'SF Mono', 'Fira Code', monospace;
2981
+ font-size: 10px;
2982
+ }
2983
+ .ref-input {
2984
+ background: var(--surface);
2985
+ border: 1px solid var(--border);
2986
+ color: var(--text);
2987
+ border-radius: 4px;
2988
+ padding: 6px 10px;
2989
+ width: 100%;
2990
+ font-size: 12px;
2991
+ font-family: inherit;
2992
+ outline: none;
2993
+ transition: border-color 0.15s;
2994
+ }
2995
+ .ref-input:focus { border-color: var(--decl-color); }
2996
+ .ref-save-btn {
2997
+ background: var(--decl-color);
2998
+ color: #fff;
2999
+ border: none;
3000
+ border-radius: 4px;
3001
+ padding: 5px 14px;
3002
+ cursor: pointer;
3003
+ font-size: 12px;
3004
+ font-weight: 600;
3005
+ transition: opacity 0.15s;
3006
+ }
3007
+ .ref-save-btn:hover { opacity: 0.9; }
3008
+ .ref-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
3009
+
3010
+ /* ── Activity pinned operation (at top of activity feed) ── */
3011
+ .activity-pinned {
3012
+ padding: 10px 16px;
3013
+ background: var(--executing-bg);
3014
+ border-bottom: 1px solid var(--executing-border);
3015
+ display: flex;
3016
+ align-items: center;
3017
+ gap: 8px;
3018
+ font-size: 12px;
3019
+ color: var(--executing-color);
3020
+ font-weight: 600;
3021
+ letter-spacing: 0.02em;
3022
+ flex-shrink: 0;
3023
+ }
3024
+ .activity-pinned .pinned-spinner {
3025
+ width: 10px;
3026
+ height: 10px;
3027
+ border: 2px solid var(--border);
3028
+ border-top-color: var(--executing-color);
3029
+ border-radius: 50%;
3030
+ animation: spin 0.7s linear infinite;
3031
+ flex-shrink: 0;
3032
+ }
3033
+
3034
+ /* ── Agent activity cards ── */
3035
+ .agent-card {
3036
+ background: var(--surface2);
3037
+ border: 1px solid var(--border);
3038
+ border-radius: var(--radius);
3039
+ padding: 10px 12px;
3040
+ display: flex;
3041
+ flex-direction: column;
3042
+ gap: 6px;
3043
+ transition: background 0.15s;
3044
+ }
3045
+ .agent-card:hover { background: var(--surface3); }
3046
+ .agent-card.status-running { border-left: 3px solid var(--executing-color); }
3047
+ .agent-card.status-complete,
3048
+ .agent-card.status-done { border-left: 3px solid var(--act-color); opacity: 0.8; }
3049
+ .agent-card.status-failed { border-left: 3px solid var(--broken-color); opacity: 0.8; }
3050
+ .agent-card-header {
3051
+ display: flex;
3052
+ align-items: center;
3053
+ gap: 8px;
3054
+ }
3055
+ .agent-card-icon {
3056
+ font-size: 14px;
3057
+ flex-shrink: 0;
3058
+ width: 20px;
3059
+ text-align: center;
3060
+ }
3061
+ .agent-card-target {
3062
+ font-size: 12px;
3063
+ font-weight: 600;
3064
+ color: var(--text-bright);
3065
+ overflow: hidden;
3066
+ text-overflow: ellipsis;
3067
+ white-space: nowrap;
3068
+ flex: 1;
3069
+ }
3070
+ .agent-card-badge {
3071
+ font-size: 10px;
3072
+ font-weight: 700;
3073
+ letter-spacing: 0.04em;
3074
+ text-transform: uppercase;
3075
+ padding: 2px 6px;
3076
+ border-radius: 3px;
3077
+ flex-shrink: 0;
3078
+ }
3079
+ .agent-card-badge.badge-running { color: var(--executing-color); background: var(--executing-bg); }
3080
+ .agent-card-badge.badge-complete,
3081
+ .agent-card-badge.badge-done { color: var(--act-color); background: var(--act-bg); }
3082
+ .agent-card-badge.badge-failed { color: var(--broken-color); background: var(--broken-bg); }
3083
+ .agent-card-meta {
3084
+ display: flex;
3085
+ align-items: center;
3086
+ gap: 8px;
3087
+ font-size: 11px;
3088
+ color: var(--text-dim);
3089
+ }
3090
+ .agent-card-type { text-transform: capitalize; }
3091
+ .agent-card-timer {
3092
+ font-family: 'SF Mono', 'Fira Code', monospace;
3093
+ font-size: 11px;
3094
+ color: var(--text-dim);
3095
+ }
3096
+ .status-running .agent-card-timer { color: var(--executing-color); }
3097
+ .agent-card-error {
3098
+ font-size: 11px;
3099
+ color: var(--broken-color);
3100
+ margin-top: 2px;
3101
+ overflow: hidden;
3102
+ text-overflow: ellipsis;
3103
+ white-space: nowrap;
3104
+ }
3105
+ .agent-card-summary {
3106
+ font-size: 12px;
3107
+ color: var(--text-dim);
3108
+ margin-top: 4px;
3109
+ white-space: nowrap;
3110
+ overflow: hidden;
3111
+ text-overflow: ellipsis;
3112
+ }
3113
+ .agent-card-view-result {
3114
+ display: inline-block;
3115
+ margin-top: 6px;
3116
+ padding: 3px 10px;
3117
+ font-size: 11px;
3118
+ font-weight: 500;
3119
+ color: var(--act-color);
3120
+ background: transparent;
3121
+ border: 1px solid var(--act-color);
3122
+ border-radius: 4px;
3123
+ cursor: pointer;
3124
+ transition: background 0.15s, color 0.15s;
3125
+ align-self: flex-start;
3126
+ }
3127
+ .agent-card-view-result:hover {
3128
+ background: var(--act-color);
3129
+ color: var(--surface1);
3130
+ }
3131
+
3132
+ /* ── Discuss (interview) flow ── */
3133
+ .discuss-container {
3134
+ margin-top: 8px;
3135
+ border: 1px solid var(--border);
3136
+ border-radius: var(--radius);
3137
+ padding: 10px;
3138
+ background: var(--surface2);
3139
+ }
3140
+ .discuss-loading { display: flex; flex-direction: column; gap: 8px; }
3141
+ .discuss-streaming {
3142
+ font-family: 'SF Mono', 'Fira Code', monospace;
3143
+ font-size: 11px;
3144
+ color: var(--executing-color);
3145
+ max-height: 120px;
3146
+ overflow-y: auto;
3147
+ white-space: pre-wrap;
3148
+ word-break: break-word;
3149
+ margin: 0;
3150
+ }
3151
+ .discuss-header {
3152
+ font-size: 12px;
3153
+ font-weight: 600;
3154
+ color: var(--text-bright);
3155
+ margin-bottom: 8px;
3156
+ }
3157
+ .discuss-q {
3158
+ margin-bottom: 10px;
3159
+ padding-bottom: 8px;
3160
+ border-bottom: 1px solid var(--border);
3161
+ }
3162
+ .discuss-q:last-of-type { border-bottom: none; }
3163
+ .discuss-q-label {
3164
+ font-size: 12px;
3165
+ font-weight: 600;
3166
+ color: var(--text-bright);
3167
+ display: block;
3168
+ margin-bottom: 4px;
3169
+ }
3170
+ .discuss-q-context {
3171
+ font-size: 11px;
3172
+ color: var(--text-dim);
3173
+ margin-bottom: 6px;
3174
+ font-style: italic;
3175
+ }
3176
+ .discuss-q-options {
3177
+ display: flex;
3178
+ flex-wrap: wrap;
3179
+ gap: 4px;
3180
+ margin-bottom: 6px;
3181
+ }
3182
+ .discuss-option-btn {
3183
+ padding: 3px 10px;
3184
+ font-size: 11px;
3185
+ border: 1px solid var(--border);
3186
+ border-radius: 4px;
3187
+ background: var(--surface3);
3188
+ color: var(--text-muted);
3189
+ cursor: pointer;
3190
+ }
3191
+ .discuss-option-btn:hover {
3192
+ border-color: var(--accent);
3193
+ color: var(--accent);
3194
+ }
3195
+ .discuss-q-input {
3196
+ width: 100%;
3197
+ background: var(--surface1);
3198
+ border: 1px solid var(--border);
3199
+ border-radius: 4px;
3200
+ color: var(--text-bright);
3201
+ font-size: 12px;
3202
+ padding: 6px 8px;
3203
+ resize: vertical;
3204
+ font-family: inherit;
3205
+ }
3206
+ .discuss-q-input:focus {
3207
+ outline: none;
3208
+ border-color: var(--accent);
3209
+ }
3210
+ .discuss-actions {
3211
+ display: flex;
3212
+ gap: 8px;
3213
+ margin-top: 10px;
3214
+ }
3215
+ .discuss-error {
3216
+ font-size: 12px;
3217
+ color: var(--text-muted);
3218
+ margin-bottom: 8px;
3219
+ }
3220
+ .agent-timer-final {
3221
+ color: var(--text-muted);
3222
+ }
3223
+
3224
+ /* ── Classification toggle buttons ── */
3225
+ .classify-btn {
3226
+ background: var(--surface2);
3227
+ border: 1px solid var(--border);
3228
+ color: var(--text-dim);
3229
+ padding: 4px 12px;
3230
+ border-radius: 6px;
3231
+ font-size: 11px;
3232
+ font-weight: 600;
3233
+ cursor: pointer;
3234
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
3235
+ }
3236
+ .classify-btn:hover { background: #252535; border-color: #3a3a50; color: var(--text); }
3237
+ .classify-btn.active {
3238
+ background: var(--mile-bg);
3239
+ border-color: var(--mile-border);
3240
+ color: var(--mile-color);
3241
+ }
3242
+
3243
+ /* ── Classification icon on nodes ── */
3244
+ .class-icon {
3245
+ font-size: 10px;
3246
+ margin-right: 4px;
3247
+ vertical-align: middle;
3248
+ }
3249
+
3250
+ /* ── Readiness badges on milestone nodes ── */
3251
+ .readiness-badge {
3252
+ display: inline-block;
3253
+ font-size: 9px;
3254
+ font-weight: 600;
3255
+ letter-spacing: 0.5px;
3256
+ padding: 1px 6px;
3257
+ border-radius: 8px;
3258
+ margin-left: 4px;
3259
+ vertical-align: middle;
3260
+ }
3261
+ .readiness-ready {
3262
+ background: rgba(52, 211, 153, 0.15);
3263
+ color: #34d399;
3264
+ border: 1px solid rgba(52, 211, 153, 0.3);
3265
+ }
3266
+ .readiness-blocked {
3267
+ background: rgba(255, 77, 109, 0.15);
3268
+ color: #ff4d6d;
3269
+ border: 1px solid rgba(255, 77, 109, 0.3);
3270
+ }
3271
+ .readiness-no-actions {
3272
+ background: rgba(110, 110, 136, 0.15);
3273
+ color: #6e6e88;
3274
+ border: 1px solid rgba(110, 110, 136, 0.3);
3275
+ }
3276
+
3277
+ /* ── Dependency indicator on nodes ── */
3278
+ .dep-indicator {
3279
+ font-size: 9px;
3280
+ margin-left: 5px;
3281
+ padding: 1px 5px;
3282
+ border-radius: 8px;
3283
+ background: rgba(255,255,255,0.06);
3284
+ color: var(--text-dim);
3285
+ vertical-align: middle;
3286
+ }
3287
+
3288
+ /* ── Dependency tags in detail panel ── */
3289
+ .dep-tag {
3290
+ display: inline-flex;
3291
+ align-items: center;
3292
+ gap: 4px;
3293
+ padding: 3px 8px;
3294
+ border-radius: 6px;
3295
+ font-size: 11px;
3296
+ font-weight: 500;
3297
+ background: var(--mile-bg);
3298
+ border: 1px solid var(--mile-border);
3299
+ color: var(--mile-color);
3300
+ cursor: pointer;
3301
+ transition: border-color 0.12s;
3302
+ }
3303
+ .dep-tag:hover { border-color: var(--mile-color); }
3304
+ .dep-remove {
3305
+ font-size: 13px;
3306
+ line-height: 1;
3307
+ opacity: 0.5;
3308
+ cursor: pointer;
3309
+ transition: opacity 0.12s;
3310
+ }
3311
+ .dep-remove:hover { opacity: 1; color: var(--broken-color); }
3312
+
3313
+ /* ── Dependency edges in DAG ── */
3314
+ .edge.dep-edge {
3315
+ stroke: var(--mile-color);
3316
+ stroke-dasharray: 6 4;
3317
+ opacity: 0.4;
3318
+ }
3319
+ .edge.dep-edge.highlight {
3320
+ opacity: 0.8;
3321
+ }
3322
+
3323
+ /* ── Review state badges ── */
3324
+ .review-badge {
3325
+ display: inline-block;
3326
+ padding: 2px 7px;
3327
+ border-radius: 99px;
3328
+ font-size: 10px;
3329
+ font-weight: 600;
3330
+ letter-spacing: 0.02em;
3331
+ text-transform: uppercase;
3332
+ cursor: pointer;
3333
+ user-select: none;
3334
+ transition: opacity 0.15s;
3335
+ }
3336
+ .review-badge:hover { opacity: 0.8; }
3337
+ .review-draft { background: rgba(255,255,255,0.05); color: var(--text-dim); border: 1px solid var(--border); }
3338
+ .review-in_review { background: rgba(147,197,253,0.1); color: #93c5fd; border: 1px solid rgba(147,197,253,0.25); }
3339
+ .review-revision_needed { background: rgba(251,191,36,0.1); color: #fbbf24; border: 1px solid rgba(251,191,36,0.25); }
3340
+ .review-approved { background: rgba(134,239,172,0.1); color: #86efac; border: 1px solid rgba(134,239,172,0.25); }
3341
+
3342
+ /* ── Annotation panel ── */
3343
+ .annotation-panel {
3344
+ margin-top: 20px;
3345
+ border-top: 1px solid var(--border);
3346
+ padding-top: 16px;
3347
+ }
3348
+ .annotation-count {
3349
+ font-size: 10px;
3350
+ color: var(--text-dim);
3351
+ font-weight: 400;
3352
+ }
3353
+ .annotation-lines {
3354
+ font-family: 'SF Mono', 'Fira Code', monospace;
3355
+ font-size: 11px;
3356
+ line-height: 1.6;
3357
+ background: var(--bg);
3358
+ border: 1px solid var(--border);
3359
+ border-radius: 6px;
3360
+ padding: 8px 0;
3361
+ max-height: 400px;
3362
+ overflow-y: auto;
3363
+ }
3364
+ .ann-line {
3365
+ display: flex;
3366
+ padding: 0 10px;
3367
+ }
3368
+ .ann-line:hover {
3369
+ background: var(--surface2);
3370
+ }
3371
+ .ann-line-num {
3372
+ color: var(--text-dim);
3373
+ opacity: 0.5;
3374
+ min-width: 32px;
3375
+ text-align: right;
3376
+ padding-right: 10px;
3377
+ cursor: pointer;
3378
+ user-select: none;
3379
+ }
3380
+ .ann-line-num:hover {
3381
+ opacity: 1;
3382
+ color: #60a5fa;
3383
+ }
3384
+ .ann-line-text {
3385
+ white-space: pre;
3386
+ overflow-x: auto;
3387
+ flex: 1;
3388
+ }
3389
+ .ann-line.has-annotation {
3390
+ background: rgba(234, 179, 8, 0.08);
3391
+ border-left: 2px solid #eab308;
3392
+ }
3393
+ .ann-comment {
3394
+ display: flex;
3395
+ align-items: center;
3396
+ gap: 8px;
3397
+ padding: 4px 10px 4px 42px;
3398
+ background: rgba(234, 179, 8, 0.06);
3399
+ border-left: 2px solid #eab308;
3400
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3401
+ font-size: 11px;
3402
+ }
3403
+ .ann-comment-text {
3404
+ flex: 1;
3405
+ color: #eab308;
3406
+ }
3407
+ .ann-comment-meta {
3408
+ font-size: 9px;
3409
+ color: var(--text-dim);
3410
+ opacity: 0.6;
3411
+ }
3412
+ .ann-resolve-btn {
3413
+ background: none;
3414
+ border: none;
3415
+ color: var(--text-dim);
3416
+ cursor: pointer;
3417
+ font-size: 14px;
3418
+ padding: 0 4px;
3419
+ opacity: 0.5;
3420
+ }
3421
+ .ann-resolve-btn:hover {
3422
+ opacity: 1;
3423
+ color: var(--broken-color);
3424
+ }
3425
+ .ann-input-row {
3426
+ display: flex;
3427
+ gap: 6px;
3428
+ padding: 4px 10px 4px 42px;
3429
+ background: rgba(96, 165, 250, 0.06);
3430
+ }
3431
+ .ann-input {
3432
+ flex: 1;
3433
+ background: var(--surface);
3434
+ border: 1px solid var(--border);
3435
+ color: var(--text);
3436
+ border-radius: 4px;
3437
+ padding: 4px 8px;
3438
+ font-size: 11px;
3439
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3440
+ }
3441
+ .ann-input:focus {
3442
+ outline: none;
3443
+ border-color: #60a5fa;
3444
+ }
3445
+ .ann-submit-btn {
3446
+ background: #60a5fa;
3447
+ color: #000;
3448
+ border: none;
3449
+ border-radius: 4px;
3450
+ padding: 4px 10px;
3451
+ font-size: 10px;
3452
+ font-weight: 700;
3453
+ cursor: pointer;
3454
+ }
3455
+ .ann-submit-btn:hover {
3456
+ background: #93bbfd;
3457
+ }
3458
+ .ann-show-more-btn {
3459
+ display: block;
3460
+ width: 100%;
3461
+ background: none;
3462
+ border: none;
3463
+ border-top: 1px solid var(--border);
3464
+ color: var(--text-dim);
3465
+ padding: 6px;
3466
+ font-size: 10px;
3467
+ cursor: pointer;
3468
+ text-align: center;
3469
+ }
3470
+ .ann-show-more-btn:hover {
3471
+ color: var(--text);
3472
+ background: var(--surface2);
3473
+ }
3474
+ .ann-no-artifact {
3475
+ color: var(--text-dim);
3476
+ font-size: 11px;
3477
+ opacity: 0.5;
3478
+ font-style: italic;
3479
+ padding: 8px 0;
3480
+ }
3481
+ .ann-approve-section {
3482
+ display: flex;
3483
+ align-items: center;
3484
+ gap: 12px;
3485
+ margin-top: 12px;
3486
+ padding: 10px 12px;
3487
+ background: rgba(34, 197, 94, 0.08);
3488
+ border: 1px solid rgba(34, 197, 94, 0.3);
3489
+ border-radius: 6px;
3490
+ }
3491
+ .ann-approve-msg {
3492
+ flex: 1;
3493
+ font-size: 11px;
3494
+ color: #22c55e;
3495
+ font-weight: 500;
3496
+ }
3497
+ .ann-approve-btn {
3498
+ background: #22c55e;
3499
+ color: #000;
3500
+ border: none;
3501
+ border-radius: 4px;
3502
+ padding: 6px 16px;
3503
+ font-size: 11px;
3504
+ font-weight: 700;
3505
+ cursor: pointer;
3506
+ text-transform: uppercase;
3507
+ letter-spacing: 0.05em;
3508
+ }
3509
+ .ann-approve-btn:hover {
3510
+ background: #4ade80;
3511
+ }
3512
+
3513
+ /* ── Revision round badge ── */
3514
+ .revision-round-badge {
3515
+ background: #e8e0ff;
3516
+ color: #5b21b6;
3517
+ font-size: 11px;
3518
+ padding: 2px 8px;
3519
+ border-radius: 10px;
3520
+ font-weight: 600;
3521
+ margin-left: 8px;
3522
+ }
3523
+
3524
+ /* ── Revision request button and output panel ── */
3525
+ .ann-revise-section {
3526
+ padding: 12px 8px;
3527
+ border-top: 1px solid #e5e7eb;
3528
+ margin-top: 8px;
3529
+ }
3530
+ .ann-revise-btn {
3531
+ background: #7c3aed;
3532
+ color: white;
3533
+ border: none;
3534
+ padding: 8px 16px;
3535
+ border-radius: 6px;
3536
+ cursor: pointer;
3537
+ font-weight: 600;
3538
+ width: 100%;
3539
+ font-size: 12px;
3540
+ }
3541
+ .ann-revise-btn:hover {
3542
+ background: #6d28d9;
3543
+ }
3544
+ .ann-revise-btn:disabled {
3545
+ opacity: 0.6;
3546
+ cursor: not-allowed;
3547
+ }
3548
+ .ann-revise-hint {
3549
+ font-size: 11px;
3550
+ color: #6b7280;
3551
+ margin-top: 4px;
3552
+ text-align: center;
3553
+ }
3554
+ #revision-panel {
3555
+ background: #1e1b2e;
3556
+ border-radius: 8px;
3557
+ padding: 12px;
3558
+ margin-top: 12px;
3559
+ }
3560
+ .revision-panel-header {
3561
+ color: #c4b5fd;
3562
+ font-weight: 600;
3563
+ margin-bottom: 8px;
3564
+ font-size: 13px;
3565
+ }
3566
+ #revision-output {
3567
+ background: #0f0d1a;
3568
+ color: #e2e8f0;
3569
+ font-size: 11px;
3570
+ font-family: monospace;
3571
+ padding: 8px;
3572
+ border-radius: 4px;
3573
+ max-height: 300px;
3574
+ overflow-y: auto;
3575
+ white-space: pre-wrap;
3576
+ word-break: break-word;
3577
+ }
3578
+ .revision-stop-btn {
3579
+ background: #ef4444;
3580
+ color: white;
3581
+ border: none;
3582
+ padding: 4px 12px;
3583
+ border-radius: 4px;
3584
+ cursor: pointer;
3585
+ margin-top: 8px;
3586
+ font-size: 12px;
3587
+ }
3588
+ .revision-stop-btn:hover {
3589
+ background: #dc2626;
3590
+ }
3591
+
3592
+ /* ── Diff view ── */
3593
+ .ann-diff-toggle {
3594
+ background: transparent;
3595
+ border: 1px solid #7c3aed;
3596
+ color: #7c3aed;
3597
+ font-size: 11px;
3598
+ padding: 2px 8px;
3599
+ border-radius: 4px;
3600
+ cursor: pointer;
3601
+ margin-left: 8px;
3602
+ }
3603
+ .ann-diff-toggle:hover {
3604
+ background: #7c3aed;
3605
+ color: white;
3606
+ }
3607
+ .diff-view {
3608
+ font-family: 'SF Mono', 'Fira Code', monospace;
3609
+ font-size: 11px;
3610
+ overflow-x: auto;
3611
+ max-height: 500px;
3612
+ overflow-y: auto;
3613
+ border-radius: 4px;
3614
+ border: 1px solid var(--border);
3615
+ }
3616
+ .diff-header {
3617
+ padding: 8px 12px;
3618
+ background: var(--surface2);
3619
+ border-bottom: 1px solid var(--border);
3620
+ display: flex;
3621
+ justify-content: space-between;
3622
+ align-items: center;
3623
+ font-weight: 600;
3624
+ font-size: 12px;
3625
+ color: var(--text-bright);
3626
+ }
3627
+ .diff-line {
3628
+ display: flex;
3629
+ padding: 0 8px;
3630
+ min-height: 20px;
3631
+ line-height: 20px;
3632
+ }
3633
+ .diff-line.diff-add {
3634
+ background: rgba(34, 197, 94, 0.12);
3635
+ }
3636
+ .diff-line.diff-remove {
3637
+ background: rgba(239, 68, 68, 0.12);
3638
+ }
3639
+ .diff-line.diff-same {
3640
+ background: transparent;
3641
+ }
3642
+ .diff-gutter {
3643
+ width: 35px;
3644
+ text-align: right;
3645
+ padding-right: 8px;
3646
+ color: var(--text-dim);
3647
+ user-select: none;
3648
+ flex-shrink: 0;
3649
+ font-size: 10px;
3650
+ opacity: 0.5;
3651
+ }
3652
+ .diff-gutter-old {}
3653
+ .diff-gutter-new {}
3654
+ .diff-text {
3655
+ flex: 1;
3656
+ white-space: pre-wrap;
3657
+ word-break: break-all;
3658
+ }
3659
+ .diff-prefix {
3660
+ width: 16px;
3661
+ text-align: center;
3662
+ flex-shrink: 0;
3663
+ font-weight: bold;
3664
+ }
3665
+ .diff-prefix.diff-add {
3666
+ color: #22c55e;
3667
+ }
3668
+ .diff-prefix.diff-remove {
3669
+ color: #ef4444;
3670
+ }
3671
+ .diff-close-btn {
3672
+ background: transparent;
3673
+ border: 1px solid var(--text-dim);
3674
+ color: var(--text-dim);
3675
+ font-size: 11px;
3676
+ padding: 2px 8px;
3677
+ border-radius: 4px;
3678
+ cursor: pointer;
3679
+ }
3680
+ .diff-close-btn:hover {
3681
+ border-color: var(--text-bright);
3682
+ color: var(--text-bright);
3683
+ }
3684
+
3685
+ /* ── Readiness banner ── */
3686
+ #readiness-banner {
3687
+ display: none;
3688
+ padding: 8px 16px;
3689
+ background: var(--surface);
3690
+ border-bottom: 1px solid var(--border);
3691
+ font-size: 13px;
3692
+ gap: 8px;
3693
+ align-items: center;
3694
+ flex-wrap: wrap;
3695
+ flex-shrink: 0;
3696
+ }
3697
+ #readiness-banner.active { display: flex; }
3698
+ .rb-progress { font-weight: 600; color: var(--text); }
3699
+ .rb-remaining { color: var(--text-dim); }
3700
+ .rb-complete { color: var(--act-color); font-weight: 600; }
3701
+ .rb-link {
3702
+ color: var(--act-color);
3703
+ cursor: pointer;
3704
+ text-decoration: underline;
3705
+ margin: 0 2px;
3706
+ font-size: 12px;
3707
+ }
3708
+ .rb-link:hover { opacity: 0.8; }
3709
+ .rb-more { color: var(--text-dim); font-size: 12px; }
3710
+ .enter-exec-btn {
3711
+ margin-left: 8px;
3712
+ padding: 7px 20px;
3713
+ border: none;
3714
+ border-radius: var(--radius);
3715
+ font-weight: 600;
3716
+ font-size: 13px;
3717
+ cursor: pointer;
3718
+ background: var(--accent);
3719
+ color: #111;
3720
+ transition: opacity 0.15s, transform 0.1s;
3721
+ }
3722
+ .enter-exec-btn:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
3723
+ .enter-exec-btn:active:not(:disabled) { transform: scale(0.98); }
3724
+ .enter-exec-btn:disabled {
3725
+ opacity: 0.3;
3726
+ cursor: not-allowed;
3727
+ }
3728
+
3729
+ /* ── Review action buttons ── */
3730
+ .review-actions {
3731
+ display: flex; gap: 8px; align-items: center;
3732
+ margin: 12px 0; padding: 10px;
3733
+ background: var(--surface1, var(--surface));
3734
+ border-radius: 6px;
3735
+ border: 1px solid var(--border);
3736
+ }
3737
+ .ra-btn {
3738
+ padding: 6px 14px; border-radius: 4px; border: 1px solid var(--border);
3739
+ cursor: pointer; font-size: 13px; font-weight: 500;
3740
+ background: var(--surface2, var(--surface)); color: var(--text);
3741
+ transition: background 0.15s, border-color 0.15s;
3742
+ }
3743
+ .ra-btn:hover { opacity: 0.85; }
3744
+ .ra-approve.ra-active { background: var(--done-bg); color: var(--done-color); border-color: var(--done-border); }
3745
+ .ra-revision.ra-active { background: var(--broken-bg); color: var(--broken-color); border-color: var(--broken-border); }
3746
+ .ra-state { font-size: 12px; color: var(--text-dim); margin-left: auto; }
3747
+
3748
+ /* ── Execution pipeline view ── */
3749
+ #execution-view {
3750
+ display: none;
3751
+ width: 100%;
3752
+ height: 100%;
3753
+ background: var(--bg);
3754
+ padding-right: var(--panel-width);
3755
+ }
3756
+ #execution-view.active { display: flex; flex-direction: column; }
3757
+ .exec-content { display: flex; flex-direction: row; flex: 1; overflow: hidden; }
3758
+
3759
+ .exec-left-panel {
3760
+ width: 340px;
3761
+ flex-shrink: 0;
3762
+ overflow-y: auto;
3763
+ border-right: 1px solid var(--border);
3764
+ padding: 16px;
3765
+ }
3766
+
3767
+ .exec-pipeline { }
3768
+
3769
+ .exec-output-panel {
3770
+ flex: 1;
3771
+ display: flex;
3772
+ flex-direction: column;
3773
+ overflow: hidden;
3774
+ }
3775
+ .exec-output-header {
3776
+ height: 36px;
3777
+ flex-shrink: 0;
3778
+ display: flex;
3779
+ align-items: center;
3780
+ padding: 0 16px;
3781
+ background: var(--surface);
3782
+ border-bottom: 1px solid var(--border);
3783
+ font-size: 12px;
3784
+ color: var(--text-dim);
3785
+ }
3786
+ .exec-output-log {
3787
+ flex: 1;
3788
+ overflow-y: auto;
3789
+ padding: 12px 16px;
3790
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
3791
+ font-size: 12px;
3792
+ line-height: 1.6;
3793
+ color: var(--text);
3794
+ white-space: pre-wrap;
3795
+ word-break: break-all;
3796
+ background: var(--bg);
3797
+ margin: 0;
3798
+ }
3799
+ .exec-output-empty {
3800
+ color: var(--text-dim);
3801
+ font-size: 13px;
3802
+ padding: 40px;
3803
+ text-align: center;
3804
+ }
3805
+
3806
+ .exec-wave-label {
3807
+ font-size: 11px;
3808
+ color: var(--text-dim);
3809
+ margin-bottom: 4px;
3810
+ padding-left: 4px;
3811
+ margin-top: 16px;
3812
+ }
3813
+ .exec-wave-label:first-child { margin-top: 0; }
3814
+
3815
+ .exec-milestone-group {
3816
+ margin-bottom: 16px;
3817
+ }
3818
+
3819
+ .exec-milestone-header {
3820
+ font-weight: 600;
3821
+ color: var(--mile-color);
3822
+ padding: 8px 12px;
3823
+ background: var(--mile-bg);
3824
+ border: 1px solid var(--mile-border);
3825
+ border-radius: 6px;
3826
+ font-size: 14px;
3827
+ display: flex;
3828
+ align-items: center;
3829
+ gap: 8px;
3830
+ }
3831
+ .exec-milestone-header .exec-milestone-status {
3832
+ font-size: 10px;
3833
+ font-weight: 700;
3834
+ letter-spacing: 0.05em;
3835
+ text-transform: uppercase;
3836
+ padding: 2px 8px;
3837
+ border-radius: 8px;
3838
+ background: rgba(255,255,255,0.06);
3839
+ margin-left: auto;
3840
+ flex-shrink: 0;
3841
+ }
3842
+
3843
+ .exec-action-list {
3844
+ margin-left: 20px;
3845
+ border-left: 2px solid var(--border);
3846
+ padding-left: 16px;
3847
+ }
3848
+
3849
+ .exec-action-item {
3850
+ display: flex;
3851
+ align-items: center;
3852
+ gap: 10px;
3853
+ padding: 8px 12px;
3854
+ margin: 4px 0;
3855
+ background: var(--surface);
3856
+ border: 1px solid var(--border);
3857
+ border-radius: 4px;
3858
+ cursor: pointer;
3859
+ font-size: 13px;
3860
+ transition: background 0.15s, border-color 0.15s;
3861
+ }
3862
+ .exec-action-item:hover { background: var(--surface2); }
3863
+ .exec-action-item.active {
3864
+ border-color: var(--executing-border);
3865
+ background: var(--executing-bg);
3866
+ }
3867
+
3868
+ .exec-status-dot {
3869
+ width: 10px;
3870
+ height: 10px;
3871
+ border-radius: 50%;
3872
+ flex-shrink: 0;
3873
+ transition: background 0.3s ease, box-shadow 0.3s ease;
3874
+ }
3875
+ .exec-status-dot.queued { background: #555; }
3876
+ .exec-status-dot.running { background: var(--planned-color); animation: exec-pulse 1.5s ease-in-out infinite; }
3877
+ .exec-status-dot.done { background: var(--act-color); animation: dotComplete 0.3s ease; }
3878
+ .exec-status-dot.failed { background: var(--broken-color); animation: dotComplete 0.3s ease; }
3879
+
3880
+ @keyframes exec-pulse {
3881
+ 0%, 100% { opacity: 1; }
3882
+ 50% { opacity: 0.3; }
3883
+ }
3884
+
3885
+ @keyframes dotComplete {
3886
+ 0% { transform: scale(1); }
3887
+ 50% { transform: scale(1.3); }
3888
+ 100% { transform: scale(1); }
3889
+ }
3890
+
3891
+ .exec-action-title {
3892
+ flex: 1;
3893
+ color: var(--text);
3894
+ overflow: hidden;
3895
+ text-overflow: ellipsis;
3896
+ white-space: nowrap;
3897
+ }
3898
+
3899
+ .exec-action-status-label {
3900
+ font-size: 11px;
3901
+ color: var(--text-dim);
3902
+ text-transform: uppercase;
3903
+ flex-shrink: 0;
3904
+ }
3905
+
3906
+ /* ── Execution mode: hide all edit controls ── */
3907
+ body.exec-mode #new-decl-btn { display: none; }
3908
+ body.exec-mode #play-btn { display: none; }
3909
+ body.exec-mode #workflow-banner { display: none; }
3910
+ body.exec-mode #readiness-banner { display: none; }
3911
+ body.exec-mode #side-panel { display: none; }
3912
+ body.exec-mode #activity-feed { display: none; }
3913
+ body.exec-mode #view-toggle { display: none; }
3914
+ body.exec-mode #execution-view { padding-right: 0; }
3915
+
3916
+ /* ── Execution topbar ── */
3917
+ .exec-topbar {
3918
+ display: none;
3919
+ align-items: center;
3920
+ gap: 12px;
3921
+ padding: 0 16px;
3922
+ height: 36px;
3923
+ background: var(--surface);
3924
+ border-bottom: 1px solid var(--border);
3925
+ flex-shrink: 0;
3926
+ }
3927
+ body.exec-mode .exec-topbar { display: flex; }
3928
+ body:not(.exec-mode) .exec-topbar { display: none; }
3929
+ .exec-topbar-title {
3930
+ font-size: 13px;
3931
+ font-weight: 600;
3932
+ color: var(--text-bright);
3933
+ flex-shrink: 0;
3934
+ }
3935
+ .exec-exit-btn {
3936
+ padding: 4px 12px;
3937
+ border-radius: 4px;
3938
+ border: 1px solid var(--border);
3939
+ background: var(--surface2);
3940
+ color: var(--text);
3941
+ cursor: pointer;
3942
+ font-size: 12px;
3943
+ }
3944
+ .exec-exit-btn:hover { background: var(--border); }
3945
+ .exec-stop-btn {
3946
+ padding: 4px 12px;
3947
+ border-radius: 4px;
3948
+ border: 1px solid var(--broken-border);
3949
+ background: var(--broken-bg);
3950
+ color: var(--broken-color);
3951
+ cursor: pointer;
3952
+ font-size: 12px;
3953
+ font-weight: 600;
3954
+ }
3955
+ .exec-stop-btn:hover { opacity: 0.85; }
3956
+
3957
+ /* ── Execution progress bar ── */
3958
+ .exec-progress-container {
3959
+ height: 6px;
3960
+ background: var(--bg);
3961
+ border-radius: 3px;
3962
+ flex: 1;
3963
+ margin: 0 16px;
3964
+ min-width: 120px;
3965
+ }
3966
+ .exec-progress-fill {
3967
+ height: 100%;
3968
+ background: var(--decl-color);
3969
+ border-radius: 3px;
3970
+ transition: width 0.3s ease;
3971
+ width: 0;
3972
+ }
3973
+ .exec-progress-pct {
3974
+ font-size: 13px;
3975
+ color: var(--text-dim);
3976
+ min-width: 40px;
3977
+ text-align: right;
3978
+ }
3979
+
3980
+ /* ── Pre-execution wave order view ── */
3981
+ .exec-preorder-list {
3982
+ list-style: none;
3983
+ padding: 0;
3984
+ margin: 0;
3985
+ counter-reset: wave-counter;
3986
+ }
3987
+ .exec-preorder-wave {
3988
+ border-left: 3px solid var(--planned-color);
3989
+ padding: 12px 16px;
3990
+ margin-bottom: 16px;
3991
+ }
3992
+ .exec-preorder-wave-header {
3993
+ font-size: 13px;
3994
+ font-weight: 700;
3995
+ color: var(--text);
3996
+ margin-bottom: 8px;
3997
+ }
3998
+ .exec-preorder-milestone {
3999
+ padding: 6px 12px;
4000
+ font-size: 13px;
4001
+ color: var(--mile-color);
4002
+ }
4003
+ .exec-preorder-action {
4004
+ padding: 4px 12px 4px 24px;
4005
+ font-size: 12px;
4006
+ color: var(--text-dim);
4007
+ display: flex;
4008
+ align-items: center;
4009
+ gap: 8px;
4010
+ }
4011
+ .exec-confirm-btn {
4012
+ background: var(--act-color);
4013
+ color: white;
4014
+ border: none;
4015
+ padding: 10px 24px;
4016
+ border-radius: 6px;
4017
+ font-size: 14px;
4018
+ font-weight: 600;
4019
+ cursor: pointer;
4020
+ margin-top: 20px;
4021
+ width: 100%;
4022
+ }
4023
+ .exec-confirm-btn:hover { opacity: 0.9; }
4024
+
4025
+ /* ── Drag-to-reorder feedback ── */
4026
+ .exec-dragging { opacity: 0.4; outline: 2px dashed var(--planned-color); }
4027
+ .exec-drop-valid { outline: 2px solid var(--act-color); background: rgba(52, 211, 153, 0.08); }
4028
+ .exec-drop-invalid { outline: 2px solid var(--broken-color); opacity: 0.5; cursor: no-drop; }
4029
+ .exec-preorder-milestone[draggable="true"],
4030
+ .exec-preorder-action[draggable="true"] { cursor: grab; }
4031
+ .exec-preorder-milestone[draggable="true"]:active,
4032
+ .exec-preorder-action[draggable="true"]:active { cursor: grabbing; }
4033
+ .exec-preorder-milestone[draggable="true"]::before,
4034
+ .exec-preorder-action[draggable="true"]::before {
4035
+ content: "\22EE\22EE";
4036
+ color: var(--text-dim);
4037
+ margin-right: 6px;
4038
+ font-size: 11px;
4039
+ letter-spacing: -3px;
4040
+ }
4041
+
4042
+ /* ── Failure modal ── */
4043
+ .exec-failure-overlay {
4044
+ position: fixed;
4045
+ inset: 0;
4046
+ background: rgba(0,0,0,0.6);
4047
+ z-index: 1000;
4048
+ display: flex;
4049
+ align-items: center;
4050
+ justify-content: center;
4051
+ }
4052
+ .exec-failure-modal {
4053
+ background: var(--bg-card, #1e1e1e);
4054
+ border: 1px solid var(--border, #333);
4055
+ border-radius: 8px;
4056
+ padding: 24px;
4057
+ max-width: 420px;
4058
+ width: 90%;
4059
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
4060
+ }
4061
+ .exec-failure-title {
4062
+ font-size: 16px;
4063
+ font-weight: 600;
4064
+ color: #ff6b6b;
4065
+ margin-bottom: 12px;
4066
+ }
4067
+ .exec-failure-details {
4068
+ font-size: 13px;
4069
+ color: var(--text-dim);
4070
+ margin-bottom: 20px;
4071
+ font-family: monospace;
4072
+ white-space: pre-line;
4073
+ }
4074
+ .exec-failure-actions {
4075
+ display: flex;
4076
+ gap: 10px;
4077
+ flex-wrap: wrap;
4078
+ }
4079
+ .exec-failure-btn {
4080
+ padding: 8px 16px;
4081
+ border-radius: 4px;
4082
+ border: none;
4083
+ cursor: pointer;
4084
+ font-size: 13px;
4085
+ font-weight: 500;
4086
+ }
4087
+ .exec-failure-btn.view-output {
4088
+ background: transparent;
4089
+ color: var(--accent, #4a9eff);
4090
+ border: 1px solid var(--accent, #4a9eff);
4091
+ }
4092
+ .exec-failure-btn.skip {
4093
+ background: #e8a838;
4094
+ color: #000;
4095
+ }
4096
+ .exec-failure-btn.stop {
4097
+ background: #ff4444;
4098
+ color: #fff;
4099
+ }
4100
+ .exec-failure-btn:hover { opacity: 0.85; }
4101
+
4102
+ </style>
4103
+ </head>
4104
+ <body>
4105
+
4106
+ <!-- Status bar — project name + breadcrumb + nav | integrity + next/execute -->
4107
+ <div id="status-bar">
4108
+ <span class="project-name" id="project-name">Declare</span>
4109
+ <div id="status-breadcrumb"></div>
4110
+ <button id="view-toggle" title="Toggle graph view">
4111
+ <span id="view-toggle-label">&#x2B13;</span>
4112
+ </button>
4113
+ <div class="status-right">
4114
+ <span class="status-pill" id="integrity-pill"><span class="pill-value">–</span></span>
4115
+ <button id="execute-main-btn">Next</button>
4116
+ </div>
4117
+ <button id="new-decl-btn" class="new-decl-btn" style="display:none">+ Declaration</button>
4118
+ <button id="play-btn" class="play-btn" title="Execute all ready agent milestones in dependency order" style="display:none">Play All</button>
4119
+ </div>
4120
+ <!-- Hidden stat/compat elements -->
4121
+ <span id="stat-decls" style="display:none">0</span>
4122
+ <span id="stat-miles" style="display:none">0</span>
4123
+ <span id="stat-acts" style="display:none">0</span>
4124
+ <span id="health-badge" style="display:none"></span>
4125
+ <span id="last-updated" style="display:none"></span>
4126
+ <!-- Legacy workflow banner (hidden, rendered inside status bar now) -->
4127
+ <div id="workflow-banner" style="display:none">
4128
+ <span class="wf-state-label" id="wf-state-label"></span>
4129
+ <div class="wf-progress-bar"><div class="wf-progress-fill" id="wf-progress-fill"></div></div>
4130
+ <span class="wf-pct" id="wf-pct"></span>
4131
+ <span class="wf-next-label" id="wf-next-label"></span>
4132
+ <button class="wf-action-btn" id="wf-action-btn"></button>
4133
+ </div>
4134
+
4135
+ <!-- Play progress banner -->
4136
+ <div id="play-banner">
4137
+ <span class="play-wave-label" id="play-wave-label">Wave 0/0</span>
4138
+ <div class="play-actions-list" id="play-actions-list"></div>
4139
+ <button class="play-stop-btn" id="play-stop-btn">Stop</button>
4140
+ </div>
4141
+
4142
+ <!-- Main -->
4143
+ <div id="main">
4144
+ <div id="canvas-wrap" style="display:none">
4145
+ <div id="canvas-container">
4146
+ <svg id="edges-svg"></svg>
4147
+ <div class="layer-section" id="layer-declarations">
4148
+ <div class="layer-label">Declarations</div>
4149
+ <div class="layer" id="nodes-declarations"></div>
4150
+ </div>
4151
+ <div class="layer-section" id="layer-milestones">
4152
+ <div class="layer-label">Milestones</div>
4153
+ <div class="layer" id="nodes-milestones"></div>
4154
+ </div>
4155
+ <div class="layer-section" id="layer-actions">
4156
+ <div class="layer-label">Actions</div>
4157
+ <div class="layer" id="nodes-actions"></div>
4158
+ </div>
4159
+ </div>
4160
+ </div>
4161
+
4162
+ <!-- Readiness banner — hidden, replaced by drill prompts -->
4163
+ <div id="readiness-banner"></div>
4164
+
4165
+ <!-- Drill browser — 3-panel drill-down: detail | list | activity -->
4166
+ <div id="drill-browser" class="active">
4167
+ <div id="drill-breadcrumb"></div>
4168
+ <div id="drill-body">
4169
+ <div id="drill-detail"></div>
4170
+ <div id="drill-center">
4171
+ <div id="drill-context"></div>
4172
+ <div id="drill-list"></div>
4173
+ <div id="drill-prompt"></div>
4174
+ </div>
4175
+ </div>
4176
+ </div>
4177
+
4178
+ <!-- Legacy column browser elements (hidden, kept for DOM ref compat) -->
4179
+ <div id="column-browser" style="display:none">
4180
+ <div id="col-decl-list"></div>
4181
+ <div id="col-mile-list"></div>
4182
+ <div id="col-act-list"></div>
4183
+ </div>
4184
+ <div id="decl-form-container" style="display:none"></div>
4185
+ <button id="col-decl-add-btn" style="display:none"></button>
4186
+
4187
+ <!-- Execution view — CI pipeline layout with live output panel -->
4188
+ <div id="execution-view">
4189
+ <div class="exec-topbar">
4190
+ <span class="exec-topbar-title" id="exec-topbar-title">Execution Mode</span>
4191
+ <span id="exec-wave-status" style="font-size:12px;color:var(--text-dim)"></span>
4192
+ <div class="exec-progress-container"><div class="exec-progress-fill" id="exec-progress-fill"></div></div>
4193
+ <span class="exec-progress-pct" id="exec-progress-pct"></span>
4194
+ <button class="exec-stop-btn" id="exec-stop-btn">Stop</button>
4195
+ <button class="exec-exit-btn" id="exec-exit-btn">Exit</button>
4196
+ </div>
4197
+ <div class="exec-content">
4198
+ <div class="exec-left-panel">
4199
+ <div class="exec-pipeline" id="exec-pipeline"></div>
4200
+ </div>
4201
+ <div class="exec-output-panel">
4202
+ <div class="exec-output-header" id="exec-output-header">No action selected</div>
4203
+ <pre class="exec-output-log" id="exec-output-log"></pre>
4204
+ </div>
4205
+ </div>
4206
+ <div class="exec-failure-overlay" id="exec-failure-overlay" style="display:none;">
4207
+ <div class="exec-failure-modal">
4208
+ <div class="exec-failure-title">Action Failed</div>
4209
+ <div class="exec-failure-details" id="exec-failure-details"></div>
4210
+ <div class="exec-failure-actions">
4211
+ <button class="exec-failure-btn view-output" id="exec-failure-view">View Output</button>
4212
+ <button class="exec-failure-btn skip" id="exec-failure-skip">Skip &amp; Continue</button>
4213
+ <button class="exec-failure-btn stop" id="exec-failure-stop">Stop Pipeline</button>
4214
+ </div>
4215
+ </div>
4216
+ </div>
4217
+ </div>
4218
+ </div>
4219
+
4220
+ <!-- Side panel — always visible fixed right column -->
4221
+ <div id="side-panel">
4222
+ <div id="panel-header">
4223
+ <span id="panel-title">Details</span>
4224
+ </div>
4225
+ <div id="panel-body">
4226
+ <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
4227
+ Click any node to see details.<br>
4228
+ Click a declaration or milestone<br>to focus its subtree.
4229
+ </div>
4230
+ </div>
4231
+ </div>
4232
+
4233
+ <!-- Activity feed placeholder (moved into drill-body via JS) -->
4234
+ <div id="activity-feed">
4235
+ <div id="activity-toggle">
4236
+ <div id="activity-pulse"></div>
4237
+ <div id="activity-tabs">
4238
+ <span class="activity-tab active" data-tab="cards">Agents</span>
4239
+ <span class="activity-tab" data-tab="log">Log</span>
4240
+ </div>
4241
+ </div>
4242
+ <div id="activity-cards" class="activity-tab-content active">
4243
+ <div id="command-card" class="editing" tabindex="0">
4244
+ <div class="cmd-label"><span class="cmd-key">C</span> Chat</div>
4245
+ <div class="cmd-row">
4246
+ <textarea id="command-card-input" rows="1" placeholder="Ask anything..."></textarea>
4247
+ <kbd class="cmd-shortcut">C</kbd>
4248
+ </div>
4249
+ <div id="command-card-hint">Enter to send &middot; Esc to cancel</div>
4250
+ </div>
4251
+ <div id="activity-cards-active"></div>
4252
+ <div id="activity-cards-recent"></div>
4253
+ </div>
4254
+ <div id="activity-list" class="activity-tab-content">
4255
+ <div style="padding:16px;color:var(--text-muted);font-size:11px;text-align:center;">No activity yet</div>
4256
+ </div>
4257
+ </div>
4258
+
4259
+ <!-- Loading/error overlay -->
4260
+ <div id="overlay">
4261
+ <div class="spinner"></div>
4262
+ <div id="overlay-message">Loading graph…</div>
4263
+ <div id="overlay-error"></div>
4264
+ <button id="overlay-retry">Retry</button>
4265
+ </div>
4266
+
4267
+ <div id="focus-hint">Press Esc or click outside to exit focus</div>
4268
+
4269
+ <!-- File Viewer Modal -->
4270
+ <div id="file-viewer-modal">
4271
+ <div class="file-viewer-container">
4272
+ <div class="file-viewer-header">
4273
+ <span class="file-viewer-path" id="file-viewer-path"></span>
4274
+ <button class="file-viewer-close" id="file-viewer-close">&times;</button>
4275
+ </div>
4276
+ <div class="file-viewer-body" id="file-viewer-body"></div>
4277
+ </div>
4278
+ </div>
4279
+
4280
+ <script src="/public/app.js?v=25"></script>
743
4281
  </body>
744
4282
  </html>