@teamclaws/teamclaw 2026.3.26-2 → 2026.4.2-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +52 -8
  2. package/cli.mjs +538 -224
  3. package/index.ts +76 -27
  4. package/openclaw.plugin.json +53 -28
  5. package/package.json +5 -2
  6. package/skills/teamclaw/SKILL.md +213 -0
  7. package/skills/teamclaw/references/api-quick-ref.md +117 -0
  8. package/skills/teamclaw-setup/SKILL.md +81 -0
  9. package/skills/teamclaw-setup/references/install-modes.md +136 -0
  10. package/skills/teamclaw-setup/references/validation-checklist.md +73 -0
  11. package/src/config.ts +44 -16
  12. package/src/controller/controller-capacity.ts +2 -2
  13. package/src/controller/controller-service.ts +193 -47
  14. package/src/controller/controller-tools.ts +102 -2
  15. package/src/controller/delivery-report.ts +563 -0
  16. package/src/controller/http-server.ts +1907 -172
  17. package/src/controller/kickoff-orchestrator.ts +292 -0
  18. package/src/controller/managed-gateway-process.ts +330 -0
  19. package/src/controller/orchestration-manifest.ts +69 -1
  20. package/src/controller/preview-manager.ts +676 -0
  21. package/src/controller/prompt-injector.ts +116 -67
  22. package/src/controller/role-inference.ts +41 -0
  23. package/src/controller/websocket.ts +3 -1
  24. package/src/controller/worker-provisioning.ts +429 -74
  25. package/src/discovery.ts +1 -1
  26. package/src/git-collaboration.ts +198 -47
  27. package/src/identity.ts +12 -2
  28. package/src/interaction-contracts.ts +179 -3
  29. package/src/networking.ts +99 -0
  30. package/src/openclaw-workspace.ts +478 -11
  31. package/src/prompt-policy.ts +381 -0
  32. package/src/roles.ts +37 -36
  33. package/src/state.ts +40 -1
  34. package/src/task-executor.ts +282 -78
  35. package/src/types.ts +150 -7
  36. package/src/ui/app.js +1403 -175
  37. package/src/ui/assets/teamclaw-app-icon.png +0 -0
  38. package/src/ui/index.html +122 -40
  39. package/src/ui/style.css +829 -143
  40. package/src/worker/http-handler.ts +40 -4
  41. package/src/worker/prompt-injector.ts +9 -38
  42. package/src/worker/skill-installer.ts +2 -2
  43. package/src/worker/tools.ts +31 -5
  44. package/src/worker/worker-service.ts +49 -8
  45. package/src/workspace-browser.ts +20 -7
  46. package/src/controller/local-worker-manager.ts +0 -533
package/src/ui/style.css CHANGED
@@ -41,6 +41,20 @@ body {
41
41
  border-bottom: 1px solid var(--border);
42
42
  }
43
43
 
44
+ .header-brand {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 10px;
48
+ }
49
+
50
+ .header-logo {
51
+ width: 32px;
52
+ height: 32px;
53
+ border-radius: 10px;
54
+ object-fit: cover;
55
+ box-shadow: 0 4px 16px rgba(59, 130, 246, 0.18);
56
+ }
57
+
44
58
  .header-title {
45
59
  font-size: 18px;
46
60
  font-weight: 700;
@@ -55,6 +69,20 @@ body {
55
69
  color: var(--text-secondary);
56
70
  }
57
71
 
72
+ .header-mini-btn {
73
+ border: 1px solid var(--border);
74
+ border-radius: 999px;
75
+ background: var(--bg-tertiary);
76
+ color: var(--text-primary);
77
+ padding: 6px 10px;
78
+ font-size: 12px;
79
+ cursor: pointer;
80
+ }
81
+
82
+ .header-mini-btn:hover {
83
+ border-color: var(--accent);
84
+ }
85
+
58
86
  .status-dot {
59
87
  width: 8px;
60
88
  height: 8px;
@@ -161,6 +189,9 @@ body {
161
189
  }
162
190
 
163
191
  .tab {
192
+ display: inline-flex;
193
+ align-items: center;
194
+ gap: 8px;
164
195
  padding: 10px 20px;
165
196
  background: none;
166
197
  border: none;
@@ -177,6 +208,19 @@ body {
177
208
  border-bottom-color: var(--accent);
178
209
  }
179
210
 
211
+ .tab.has-active {
212
+ color: var(--text-primary);
213
+ }
214
+
215
+ .tab.has-attention {
216
+ color: #fbbf24;
217
+ }
218
+
219
+ .tab-label {
220
+ display: inline-flex;
221
+ align-items: center;
222
+ }
223
+
180
224
  .tab-badge {
181
225
  display: inline-flex;
182
226
  align-items: center;
@@ -192,19 +236,127 @@ body {
192
236
  font-weight: 700;
193
237
  }
194
238
 
195
- .tab-badge.has-items {
239
+ .tab-badge.tone-active {
240
+ background: #14532d;
241
+ color: #fff;
242
+ }
243
+
244
+ .tab-badge.tone-attention {
196
245
  background: var(--danger);
197
246
  color: #fff;
198
247
  }
199
248
 
249
+ .tab-signal {
250
+ width: 8px;
251
+ height: 8px;
252
+ border-radius: 999px;
253
+ background: transparent;
254
+ box-shadow: none;
255
+ transition: background 0.15s ease, box-shadow 0.15s ease;
256
+ }
257
+
258
+ .tab-signal.tone-active {
259
+ background: #34d399;
260
+ box-shadow: 0 0 0 4px rgba(52, 211, 153, 0.18);
261
+ }
262
+
263
+ .tab-signal.tone-attention {
264
+ background: #f59e0b;
265
+ box-shadow: 0 0 0 4px rgba(245, 158, 11, 0.2);
266
+ }
267
+
200
268
  .tab-content {
201
269
  flex: 1;
202
270
  overflow-y: auto;
203
271
  padding: 16px 20px;
204
272
  }
205
273
 
274
+ .worker-install-card {
275
+ margin: 16px 20px 0;
276
+ padding: 14px 16px;
277
+ border: 1px solid var(--border);
278
+ border-radius: var(--radius);
279
+ background: var(--bg-secondary);
280
+ box-shadow: var(--shadow);
281
+ }
282
+
283
+ .worker-install-head {
284
+ display: flex;
285
+ align-items: flex-start;
286
+ justify-content: space-between;
287
+ gap: 12px;
288
+ margin-bottom: 12px;
289
+ }
290
+
291
+ .worker-install-head h3 {
292
+ font-size: 15px;
293
+ margin: 0 0 4px;
294
+ }
295
+
296
+ .worker-install-copy {
297
+ border: 1px solid var(--border);
298
+ border-radius: 6px;
299
+ background: var(--bg-tertiary);
300
+ color: var(--text-primary);
301
+ padding: 8px 12px;
302
+ cursor: pointer;
303
+ }
304
+
305
+ .worker-install-copy:hover {
306
+ border-color: var(--accent);
307
+ }
308
+
309
+ .worker-install-subtitle,
310
+ .worker-install-note {
311
+ color: var(--text-secondary);
312
+ font-size: 13px;
313
+ }
314
+
315
+ .worker-install-controls {
316
+ display: grid;
317
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
318
+ gap: 12px;
319
+ margin-bottom: 12px;
320
+ }
321
+
322
+ .worker-install-field label {
323
+ display: block;
324
+ margin-bottom: 6px;
325
+ font-size: 12px;
326
+ color: var(--text-muted);
327
+ text-transform: uppercase;
328
+ letter-spacing: 0.04em;
329
+ }
330
+
331
+ .worker-install-field select {
332
+ width: 100%;
333
+ border: 1px solid var(--border);
334
+ border-radius: 6px;
335
+ background: var(--bg-tertiary);
336
+ color: var(--text-primary);
337
+ padding: 9px 10px;
338
+ }
339
+
340
+ .worker-install-command {
341
+ margin: 0 0 10px;
342
+ padding: 12px 14px;
343
+ border-radius: 6px;
344
+ background: #0b1220;
345
+ color: #dbeafe;
346
+ overflow-x: auto;
347
+ white-space: pre-wrap;
348
+ word-break: break-word;
349
+ font-size: 12px;
350
+ line-height: 1.5;
351
+ }
352
+
353
+ .worker-install-note.warning {
354
+ color: #facc15;
355
+ }
356
+
206
357
  .tab-panel { display: none; }
207
358
  .tab-panel.active { display: block; }
359
+ #tab-planning.active { display: flex; height: 100%; }
208
360
 
209
361
  .panel-note {
210
362
  margin-bottom: 14px;
@@ -217,6 +369,22 @@ body {
217
369
  line-height: 1.5;
218
370
  }
219
371
 
372
+ .runtime-alert {
373
+ margin: 16px 20px 0;
374
+ padding: 12px 14px;
375
+ border: 1px solid rgba(234, 179, 8, 0.35);
376
+ border-left: 4px solid var(--warning);
377
+ border-radius: var(--radius);
378
+ background: rgba(234, 179, 8, 0.12);
379
+ color: #fef3c7;
380
+ font-size: 13px;
381
+ line-height: 1.5;
382
+ }
383
+
384
+ .runtime-alert strong {
385
+ color: var(--text-primary);
386
+ }
387
+
220
388
  .task-filters {
221
389
  display: flex;
222
390
  gap: 6px;
@@ -467,108 +635,588 @@ body {
467
635
  display: flex;
468
636
  flex-direction: column;
469
637
  gap: 12px;
470
- margin-bottom: 16px;
638
+ margin-bottom: 16px;
639
+ }
640
+
641
+ .controller-run-card {
642
+ background: var(--bg-secondary);
643
+ border: 1px solid var(--border);
644
+ border-radius: var(--radius);
645
+ padding: 14px 16px;
646
+ display: flex;
647
+ flex-direction: column;
648
+ gap: 12px;
649
+ }
650
+
651
+ .controller-run-header {
652
+ display: flex;
653
+ align-items: flex-start;
654
+ justify-content: space-between;
655
+ gap: 16px;
656
+ }
657
+
658
+ .controller-run-heading h3 {
659
+ margin: 0;
660
+ font-size: 15px;
661
+ }
662
+
663
+ .controller-run-kicker,
664
+ .controller-run-meta,
665
+ .controller-run-section-title,
666
+ .controller-run-event-meta {
667
+ color: var(--text-muted);
668
+ font-size: 12px;
669
+ }
670
+
671
+ .controller-run-section {
672
+ display: flex;
673
+ flex-direction: column;
674
+ gap: 6px;
675
+ }
676
+
677
+ .controller-run-status {
678
+ font-size: 11px;
679
+ font-weight: 700;
680
+ text-transform: uppercase;
681
+ padding: 4px 9px;
682
+ border-radius: 999px;
683
+ }
684
+
685
+ .controller-run-status.pending { background: var(--bg-tertiary); color: var(--text-secondary); }
686
+ .controller-run-status.running { background: #422006; color: var(--warning); }
687
+ .controller-run-status.completed { background: #14532d; color: var(--success); }
688
+ .controller-run-status.failed { background: #450a0a; color: var(--danger); }
689
+
690
+ .controller-run-created-tasks {
691
+ display: flex;
692
+ flex-wrap: wrap;
693
+ gap: 8px;
694
+ }
695
+
696
+ .controller-run-task-link {
697
+ padding: 6px 10px;
698
+ border-radius: 999px;
699
+ border: 1px solid rgba(96, 165, 250, 0.25);
700
+ background: rgba(96, 165, 250, 0.12);
701
+ color: var(--accent);
702
+ cursor: pointer;
703
+ font-size: 12px;
704
+ font-weight: 600;
705
+ }
706
+
707
+ .controller-run-task-link:hover {
708
+ border-color: var(--accent);
709
+ }
710
+
711
+ .controller-run-events {
712
+ display: flex;
713
+ flex-direction: column;
714
+ gap: 8px;
715
+ }
716
+
717
+ .controller-run-event {
718
+ border-left: 3px solid var(--accent);
719
+ background: var(--bg-tertiary);
720
+ border-radius: 10px;
721
+ padding: 10px 12px;
722
+ }
723
+
724
+ .controller-run-event-header {
725
+ display: flex;
726
+ align-items: center;
727
+ justify-content: space-between;
728
+ gap: 12px;
729
+ margin-bottom: 6px;
730
+ }
731
+
732
+ .controller-run-event-label {
733
+ font-size: 12px;
734
+ font-weight: 700;
735
+ color: var(--text-primary);
736
+ }
737
+
738
+ .controller-run-event-body {
739
+ font-size: 13px;
740
+ }
741
+
742
+ /* Planning tab needs edge-to-edge layout (no padding from .tab-content) */
743
+ #tab-planning {
744
+ margin: -16px -20px;
745
+ width: calc(100% + 40px);
746
+ }
747
+
748
+ /* ── Planning Tab ─────────────────────────────────────────────────────── */
749
+ .planning-container {
750
+ display: flex;
751
+ height: 100%;
752
+ min-height: 0;
753
+ }
754
+
755
+ .planning-sessions {
756
+ width: 260px;
757
+ min-width: 200px;
758
+ border-right: 1px solid var(--border);
759
+ display: flex;
760
+ flex-direction: column;
761
+ overflow-y: auto;
762
+ }
763
+
764
+ .planning-sessions-header {
765
+ padding: 12px 14px;
766
+ font-size: 12px;
767
+ font-weight: 700;
768
+ text-transform: uppercase;
769
+ letter-spacing: 0.05em;
770
+ color: var(--text-muted);
771
+ border-bottom: 1px solid var(--border);
772
+ }
773
+
774
+ .planning-session-list {
775
+ display: flex;
776
+ flex-direction: column;
777
+ gap: 2px;
778
+ padding: 6px;
779
+ overflow-y: auto;
780
+ }
781
+
782
+ .planning-session-btn {
783
+ display: block;
784
+ width: 100%;
785
+ text-align: left;
786
+ padding: 10px 12px;
787
+ border: 1px solid transparent;
788
+ border-radius: var(--radius);
789
+ background: none;
790
+ cursor: pointer;
791
+ color: var(--text-primary);
792
+ font-size: 13px;
793
+ transition: background 0.12s, border-color 0.12s;
794
+ }
795
+
796
+ .planning-session-title-row {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 8px;
800
+ }
801
+
802
+ .planning-session-status {
803
+ width: 9px;
804
+ height: 9px;
805
+ border-radius: 999px;
806
+ background: var(--text-muted);
807
+ flex: 0 0 auto;
808
+ }
809
+
810
+ .planning-session-status.completed {
811
+ background: #34d399;
812
+ }
813
+
814
+ .planning-session-status.failed,
815
+ .planning-session-status.cancelled {
816
+ background: var(--danger);
817
+ }
818
+
819
+ .planning-session-status.pending,
820
+ .planning-session-status.in_progress,
821
+ .planning-session-status.active,
822
+ .planning-session-status.running {
823
+ background: #f59e0b;
824
+ box-shadow: 0 0 0 4px rgba(245, 158, 11, 0.18);
825
+ }
826
+
827
+ .planning-session-btn:hover {
828
+ background: var(--bg-tertiary);
829
+ }
830
+
831
+ .planning-session-btn.active {
832
+ background: var(--bg-tertiary);
833
+ border-color: #a78bfa;
834
+ }
835
+
836
+ .planning-session-title {
837
+ font-weight: 600;
838
+ line-height: 1.35;
839
+ margin-bottom: 3px;
840
+ }
841
+
842
+ .planning-session-meta {
843
+ font-size: 11px;
844
+ color: var(--text-muted);
845
+ }
846
+
847
+ .planning-main {
848
+ flex: 1;
849
+ min-width: 0;
850
+ display: flex;
851
+ flex-direction: column;
852
+ overflow: hidden;
853
+ }
854
+
855
+ .planning-empty-state {
856
+ display: flex;
857
+ flex-direction: column;
858
+ align-items: center;
859
+ justify-content: center;
860
+ height: 100%;
861
+ gap: 12px;
862
+ color: var(--text-muted);
863
+ text-align: center;
864
+ padding: 40px;
865
+ }
866
+
867
+ .planning-empty-icon {
868
+ font-size: 48px;
869
+ line-height: 1;
870
+ }
871
+
872
+ .planning-empty-state h3 {
873
+ margin: 0;
874
+ font-size: 18px;
875
+ color: var(--text-primary);
876
+ }
877
+
878
+ .planning-empty-state p {
879
+ margin: 0;
880
+ max-width: 400px;
881
+ line-height: 1.5;
882
+ font-size: 14px;
883
+ }
884
+
885
+ .planning-split {
886
+ display: flex;
887
+ flex: 1;
888
+ min-height: 0;
889
+ overflow: hidden;
890
+ }
891
+
892
+ .planning-pane {
893
+ display: flex;
894
+ flex-direction: column;
895
+ overflow: hidden;
896
+ }
897
+
898
+ .planning-pane-left {
899
+ flex: 2;
900
+ min-width: 0;
901
+ }
902
+
903
+ .planning-pane-right {
904
+ flex: 3;
905
+ min-width: 0;
906
+ }
907
+
908
+ .planning-divider {
909
+ width: 1px;
910
+ background: var(--border);
911
+ flex-shrink: 0;
912
+ }
913
+
914
+ .planning-pane-header {
915
+ display: flex;
916
+ align-items: center;
917
+ gap: 8px;
918
+ padding: 12px 18px;
919
+ border-bottom: 1px solid var(--border);
920
+ background: var(--bg-secondary);
921
+ }
922
+
923
+ .planning-pane-icon {
924
+ font-size: 16px;
925
+ line-height: 1;
926
+ }
927
+
928
+ .planning-pane-title {
929
+ font-size: 13px;
930
+ font-weight: 700;
931
+ color: var(--text-muted);
932
+ text-transform: uppercase;
933
+ letter-spacing: 0.04em;
934
+ }
935
+
936
+ .planning-pane-body {
937
+ flex: 1;
938
+ overflow-y: auto;
939
+ padding: 18px;
940
+ display: flex;
941
+ flex-direction: column;
942
+ gap: 12px;
943
+ }
944
+
945
+ .planning-req-original {
946
+ margin-bottom: 20px;
947
+ padding-bottom: 16px;
948
+ border-bottom: 1px solid var(--border);
949
+ }
950
+
951
+ .planning-req-section {
952
+ margin-bottom: 16px;
953
+ }
954
+
955
+ .planning-req-label {
956
+ font-size: 12px;
957
+ font-weight: 700;
958
+ color: var(--text-muted);
959
+ text-transform: uppercase;
960
+ letter-spacing: 0.04em;
961
+ margin-bottom: 8px;
962
+ }
963
+
964
+ .planning-req-body {
965
+ font-size: 13px;
966
+ line-height: 1.5;
967
+ }
968
+
969
+ .planning-task-list {
970
+ margin: 0;
971
+ padding-left: 18px;
972
+ font-size: 13px;
973
+ color: var(--text-secondary);
974
+ line-height: 1.7;
975
+ }
976
+
977
+ .planning-task-list.planning-deferred li {
978
+ color: var(--text-muted);
979
+ }
980
+
981
+ .planning-role-tag {
982
+ display: inline-block;
983
+ font-size: 11px;
984
+ padding: 1px 7px;
985
+ border-radius: 999px;
986
+ background: var(--bg-tertiary);
987
+ border: 1px solid var(--border);
988
+ color: var(--text-muted);
989
+ margin-left: 4px;
990
+ vertical-align: middle;
991
+ }
992
+
993
+ /* Kickoff content inside planning pane */
994
+ .planning-pane-body .kickoff-stats-bar {
995
+ display: flex;
996
+ gap: 16px;
997
+ margin-bottom: 20px;
998
+ padding-bottom: 16px;
999
+ border-bottom: 1px solid var(--border);
1000
+ }
1001
+
1002
+ .kickoff-stat {
1003
+ display: flex;
1004
+ flex-direction: column;
1005
+ align-items: center;
1006
+ gap: 2px;
1007
+ }
1008
+
1009
+ .kickoff-stat-num {
1010
+ font-size: 22px;
1011
+ font-weight: 800;
1012
+ color: var(--text-primary);
1013
+ }
1014
+
1015
+ .kickoff-stat-ok .kickoff-stat-num {
1016
+ color: var(--success);
1017
+ }
1018
+
1019
+ .kickoff-stat-dim .kickoff-stat-num {
1020
+ color: var(--text-muted);
1021
+ }
1022
+
1023
+ .kickoff-stat-label {
1024
+ font-size: 11px;
1025
+ color: var(--text-muted);
1026
+ text-transform: uppercase;
1027
+ letter-spacing: 0.04em;
1028
+ }
1029
+
1030
+ /* Collapsible sections */
1031
+ .kickoff-collapsible {
1032
+ margin-top: 6px;
1033
+ }
1034
+
1035
+ .kickoff-collapsible summary {
1036
+ cursor: pointer;
1037
+ user-select: none;
1038
+ list-style: none;
1039
+ }
1040
+
1041
+ .kickoff-collapsible summary::-webkit-details-marker {
1042
+ display: none;
1043
+ }
1044
+
1045
+ .kickoff-collapsible summary::before {
1046
+ content: "▸ ";
1047
+ color: var(--text-muted);
1048
+ font-size: 11px;
1049
+ }
1050
+
1051
+ .kickoff-collapsible[open] summary::before {
1052
+ content: "▾ ";
1053
+ }
1054
+
1055
+ /* ── Kickoff Meeting Panel (inside controller-run cards) ──────────────── */
1056
+ .kickoff-panel {
1057
+ background: var(--bg-tertiary);
1058
+ border: 1px solid var(--border);
1059
+ border-left: 3px solid #a78bfa;
1060
+ border-radius: 12px;
1061
+ padding: 16px;
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ gap: 16px;
1065
+ }
1066
+
1067
+ .kickoff-panel-header {
1068
+ display: flex;
1069
+ align-items: center;
1070
+ gap: 12px;
1071
+ }
1072
+
1073
+ .kickoff-panel-icon {
1074
+ font-size: 24px;
1075
+ line-height: 1;
1076
+ }
1077
+
1078
+ .kickoff-panel-heading h4 {
1079
+ margin: 0;
1080
+ font-size: 15px;
1081
+ font-weight: 700;
1082
+ color: var(--text-primary);
1083
+ }
1084
+
1085
+ .kickoff-panel-meta {
1086
+ font-size: 12px;
1087
+ color: var(--text-muted);
1088
+ margin-top: 2px;
1089
+ }
1090
+
1091
+ .kickoff-role-grid {
1092
+ display: grid;
1093
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
1094
+ gap: 12px;
471
1095
  }
472
1096
 
473
- .controller-run-card {
1097
+ .kickoff-role-card {
474
1098
  background: var(--bg-secondary);
475
1099
  border: 1px solid var(--border);
476
- border-radius: var(--radius);
477
- padding: 14px 16px;
1100
+ border-radius: 10px;
1101
+ padding: 14px;
478
1102
  display: flex;
479
1103
  flex-direction: column;
480
- gap: 12px;
1104
+ gap: 10px;
1105
+ transition: border-color 0.15s;
481
1106
  }
482
1107
 
483
- .controller-run-header {
484
- display: flex;
485
- align-items: flex-start;
486
- justify-content: space-between;
487
- gap: 16px;
1108
+ .kickoff-role-card:hover {
1109
+ border-color: #a78bfa;
488
1110
  }
489
1111
 
490
- .controller-run-heading h3 {
491
- margin: 0;
492
- font-size: 15px;
1112
+ .kickoff-role-card.kickoff-role-dismissed {
1113
+ opacity: 0.55;
493
1114
  }
494
1115
 
495
- .controller-run-kicker,
496
- .controller-run-meta,
497
- .controller-run-section-title,
498
- .controller-run-event-meta {
499
- color: var(--text-muted);
500
- font-size: 12px;
1116
+ .kickoff-role-header {
1117
+ display: flex;
1118
+ align-items: center;
1119
+ gap: 8px;
501
1120
  }
502
1121
 
503
- .controller-run-section {
504
- display: flex;
505
- flex-direction: column;
506
- gap: 6px;
1122
+ .kickoff-role-icon {
1123
+ font-size: 18px;
1124
+ line-height: 1;
507
1125
  }
508
1126
 
509
- .controller-run-status {
1127
+ .kickoff-role-name {
1128
+ font-size: 14px;
1129
+ font-weight: 700;
1130
+ color: var(--text-primary);
1131
+ flex: 1;
1132
+ }
1133
+
1134
+ .kickoff-role-badge {
510
1135
  font-size: 11px;
511
1136
  font-weight: 700;
512
1137
  text-transform: uppercase;
513
- padding: 4px 9px;
1138
+ padding: 3px 8px;
514
1139
  border-radius: 999px;
1140
+ letter-spacing: 0.02em;
515
1141
  }
516
1142
 
517
- .controller-run-status.pending { background: var(--bg-tertiary); color: var(--text-secondary); }
518
- .controller-run-status.running { background: #422006; color: var(--warning); }
519
- .controller-run-status.completed { background: #14532d; color: var(--success); }
520
- .controller-run-status.failed { background: #450a0a; color: var(--danger); }
1143
+ .kickoff-role-badge.kickoff-role-needed {
1144
+ background: #14532d;
1145
+ color: var(--success);
1146
+ }
521
1147
 
522
- .controller-run-created-tasks {
1148
+ .kickoff-role-badge.kickoff-role-dismissed {
1149
+ background: var(--bg-tertiary);
1150
+ color: var(--text-muted);
1151
+ }
1152
+
1153
+ .kickoff-role-scope {
1154
+ font-size: 13px;
1155
+ color: var(--text-secondary);
1156
+ line-height: 1.5;
1157
+ }
1158
+
1159
+ .kickoff-role-scope .markdown-body {
1160
+ font-size: 13px;
1161
+ }
1162
+
1163
+ .kickoff-role-detail {
523
1164
  display: flex;
524
- flex-wrap: wrap;
525
- gap: 8px;
1165
+ flex-direction: column;
1166
+ gap: 4px;
526
1167
  }
527
1168
 
528
- .controller-run-task-link {
529
- padding: 6px 10px;
530
- border-radius: 999px;
531
- border: 1px solid rgba(96, 165, 250, 0.25);
532
- background: rgba(96, 165, 250, 0.12);
533
- color: var(--accent);
534
- cursor: pointer;
1169
+ .kickoff-detail-label {
535
1170
  font-size: 12px;
536
1171
  font-weight: 600;
1172
+ color: var(--text-muted);
537
1173
  }
538
1174
 
539
- .controller-run-task-link:hover {
540
- border-color: var(--accent);
1175
+ .kickoff-detail-list {
1176
+ margin: 0;
1177
+ padding-left: 18px;
1178
+ font-size: 12px;
1179
+ color: var(--text-secondary);
1180
+ line-height: 1.6;
541
1181
  }
542
1182
 
543
- .controller-run-events {
1183
+ .kickoff-detail-list.kickoff-risks li {
1184
+ color: var(--warning);
1185
+ }
1186
+
1187
+ .kickoff-deps {
544
1188
  display: flex;
545
- flex-direction: column;
546
- gap: 8px;
1189
+ flex-wrap: wrap;
1190
+ gap: 6px;
547
1191
  }
548
1192
 
549
- .controller-run-event {
550
- border-left: 3px solid var(--accent);
1193
+ .kickoff-dep-chip {
1194
+ font-size: 11px;
1195
+ padding: 2px 8px;
1196
+ border-radius: 999px;
551
1197
  background: var(--bg-tertiary);
552
- border-radius: 10px;
553
- padding: 10px 12px;
1198
+ border: 1px solid var(--border);
1199
+ color: var(--text-secondary);
554
1200
  }
555
1201
 
556
- .controller-run-event-header {
557
- display: flex;
558
- align-items: center;
559
- justify-content: space-between;
560
- gap: 12px;
561
- margin-bottom: 6px;
1202
+ .kickoff-summary {
1203
+ border-top: 1px solid var(--border);
1204
+ padding-top: 14px;
562
1205
  }
563
1206
 
564
- .controller-run-event-label {
1207
+ .kickoff-summary-label {
565
1208
  font-size: 12px;
566
1209
  font-weight: 700;
567
- color: var(--text-primary);
1210
+ color: var(--text-muted);
1211
+ text-transform: uppercase;
1212
+ letter-spacing: 0.04em;
1213
+ margin-bottom: 8px;
568
1214
  }
569
1215
 
570
- .controller-run-event-body {
1216
+ .kickoff-summary-body {
571
1217
  font-size: 13px;
1218
+ color: var(--text-secondary);
1219
+ line-height: 1.6;
572
1220
  }
573
1221
 
574
1222
  .contract-card {
@@ -700,6 +1348,24 @@ body {
700
1348
  color: var(--text-secondary);
701
1349
  }
702
1350
 
1351
+ .deliverable-live-link {
1352
+ display: inline-block;
1353
+ padding: 1px 8px;
1354
+ margin-left: 6px;
1355
+ font-size: 11px;
1356
+ font-weight: 600;
1357
+ color: var(--accent);
1358
+ border: 1px solid var(--accent);
1359
+ border-radius: 4px;
1360
+ text-decoration: none;
1361
+ vertical-align: middle;
1362
+ }
1363
+
1364
+ .deliverable-live-link:hover {
1365
+ background: var(--accent);
1366
+ color: var(--bg-primary);
1367
+ }
1368
+
703
1369
  .messages-feed {
704
1370
  display: flex;
705
1371
  flex-direction: column;
@@ -879,7 +1545,7 @@ body {
879
1545
  display: block;
880
1546
  }
881
1547
 
882
- .workspace-tree-summary,
1548
+ .workspace-tree-dir-toggle,
883
1549
  .workspace-tree-file {
884
1550
  width: 100%;
885
1551
  min-height: 40px;
@@ -895,23 +1561,25 @@ body {
895
1561
  text-align: left;
896
1562
  cursor: pointer;
897
1563
  transition: background 0.18s, border-color 0.18s, color 0.18s;
1564
+ user-select: none;
898
1565
  }
899
1566
 
900
- .workspace-tree-summary {
901
- list-style: none;
902
- }
903
-
904
- .workspace-tree-summary::-webkit-details-marker {
905
- display: none;
1567
+ .workspace-tree-arrow {
1568
+ flex-shrink: 0;
1569
+ display: inline-block;
1570
+ width: 12px;
1571
+ font-size: 11px;
1572
+ color: var(--text-secondary);
1573
+ transition: transform 0.15s;
906
1574
  }
907
1575
 
908
- .workspace-tree-summary:hover,
1576
+ .workspace-tree-dir-toggle:hover,
909
1577
  .workspace-tree-file:hover {
910
1578
  background: var(--bg-tertiary);
911
1579
  border-color: var(--border);
912
1580
  }
913
1581
 
914
- .workspace-tree-summary:focus-visible,
1582
+ .workspace-tree-dir-toggle:focus-visible,
915
1583
  .workspace-tree-file:focus-visible,
916
1584
  .workspace-view-tab:focus-visible {
917
1585
  outline: 2px solid var(--accent-hover);
@@ -947,6 +1615,14 @@ body {
947
1615
  border-left: 1px solid var(--border);
948
1616
  }
949
1617
 
1618
+ .workspace-tree-loading,
1619
+ .workspace-tree-empty {
1620
+ padding: 6px 10px;
1621
+ font-size: 12px;
1622
+ color: var(--text-secondary);
1623
+ font-style: italic;
1624
+ }
1625
+
950
1626
  .workspace-file-meta {
951
1627
  margin-top: 6px;
952
1628
  color: var(--text-secondary);
@@ -1221,6 +1897,66 @@ body {
1221
1897
  border-color: var(--warning);
1222
1898
  }
1223
1899
 
1900
+ .clarification-prompt-modal {
1901
+ position: fixed;
1902
+ inset: 0;
1903
+ display: none;
1904
+ z-index: 1100;
1905
+ }
1906
+
1907
+ .clarification-prompt-modal.open {
1908
+ display: block;
1909
+ }
1910
+
1911
+ .clarification-prompt-backdrop {
1912
+ position: absolute;
1913
+ inset: 0;
1914
+ background: rgba(0, 0, 0, 0.45);
1915
+ }
1916
+
1917
+ .clarification-prompt-panel {
1918
+ position: absolute;
1919
+ top: 24px;
1920
+ right: 24px;
1921
+ width: min(560px, calc(100vw - 48px));
1922
+ max-height: calc(100vh - 48px);
1923
+ display: flex;
1924
+ flex-direction: column;
1925
+ background: var(--bg-secondary);
1926
+ border: 1px solid rgba(245, 158, 11, 0.45);
1927
+ border-radius: 16px;
1928
+ box-shadow: 0 22px 60px rgba(0, 0, 0, 0.42);
1929
+ overflow: hidden;
1930
+ }
1931
+
1932
+ .clarification-prompt-header {
1933
+ display: flex;
1934
+ align-items: flex-start;
1935
+ justify-content: space-between;
1936
+ gap: 16px;
1937
+ padding: 16px 18px;
1938
+ border-bottom: 1px solid var(--border);
1939
+ }
1940
+
1941
+ .clarification-prompt-kicker {
1942
+ color: #f59e0b;
1943
+ font-size: 11px;
1944
+ font-weight: 700;
1945
+ letter-spacing: 0.08em;
1946
+ text-transform: uppercase;
1947
+ margin-bottom: 6px;
1948
+ }
1949
+
1950
+ .clarification-prompt-header h2 {
1951
+ margin: 0;
1952
+ font-size: 22px;
1953
+ }
1954
+
1955
+ .clarification-prompt-body {
1956
+ padding: 18px;
1957
+ overflow: auto;
1958
+ }
1959
+
1224
1960
  .task-detail-modal {
1225
1961
  position: fixed;
1226
1962
  inset: 0;
@@ -1300,23 +2036,11 @@ body {
1300
2036
  .task-detail-toolbar {
1301
2037
  display: flex;
1302
2038
  align-items: center;
1303
- justify-content: space-between;
2039
+ justify-content: flex-end;
1304
2040
  gap: 16px;
1305
2041
  background: rgba(255, 255, 255, 0.01);
1306
2042
  }
1307
2043
 
1308
- .task-detail-follow {
1309
- display: inline-flex;
1310
- align-items: center;
1311
- gap: 8px;
1312
- font-size: 13px;
1313
- color: var(--text-secondary);
1314
- }
1315
-
1316
- .task-detail-follow input {
1317
- accent-color: var(--accent);
1318
- }
1319
-
1320
2044
  .task-detail-live-badge {
1321
2045
  display: inline-flex;
1322
2046
  align-items: center;
@@ -1342,6 +2066,9 @@ body {
1342
2066
  }
1343
2067
 
1344
2068
  .task-detail-tab {
2069
+ display: inline-flex;
2070
+ align-items: center;
2071
+ gap: 8px;
1345
2072
  border: 1px solid var(--border);
1346
2073
  background: var(--bg-tertiary);
1347
2074
  color: var(--text-secondary);
@@ -1351,12 +2078,34 @@ body {
1351
2078
  font-size: 13px;
1352
2079
  }
1353
2080
 
2081
+ .task-detail-tab-count {
2082
+ display: inline-flex;
2083
+ align-items: center;
2084
+ justify-content: center;
2085
+ min-width: 16px;
2086
+ height: 16px;
2087
+ padding: 0 5px;
2088
+ border-radius: 999px;
2089
+ font-size: 10px;
2090
+ font-weight: 700;
2091
+ background: transparent;
2092
+ color: inherit;
2093
+ }
2094
+
2095
+ .task-detail-tab-count.has-items {
2096
+ background: rgba(255, 255, 255, 0.14);
2097
+ }
2098
+
1354
2099
  .task-detail-tab.active {
1355
2100
  border-color: var(--accent);
1356
2101
  color: #fff;
1357
2102
  background: var(--accent);
1358
2103
  }
1359
2104
 
2105
+ .clarification-card-compact {
2106
+ margin: 0;
2107
+ }
2108
+
1360
2109
  .task-detail-body {
1361
2110
  flex: 1;
1362
2111
  min-height: 0;
@@ -1480,69 +2229,6 @@ body {
1480
2229
  margin-top: 10px;
1481
2230
  }
1482
2231
 
1483
- .task-detail-output-stream {
1484
- display: flex;
1485
- flex-direction: column;
1486
- gap: 12px;
1487
- }
1488
-
1489
- .task-output-entry {
1490
- background: #0c0e14;
1491
- border: 1px solid var(--border);
1492
- border-radius: var(--radius);
1493
- padding: 14px 16px;
1494
- }
1495
-
1496
- .task-output-entry.is-error {
1497
- border-left: 3px solid var(--danger);
1498
- }
1499
-
1500
- .task-output-header {
1501
- display: flex;
1502
- align-items: flex-start;
1503
- justify-content: space-between;
1504
- gap: 12px;
1505
- margin-bottom: 10px;
1506
- }
1507
-
1508
- .task-output-label {
1509
- font-size: 11px;
1510
- font-weight: 700;
1511
- text-transform: uppercase;
1512
- letter-spacing: 0.05em;
1513
- color: #c7d2fe;
1514
- }
1515
-
1516
- .task-output-meta {
1517
- color: var(--text-muted);
1518
- font-size: 12px;
1519
- }
1520
-
1521
- .task-output-body {
1522
- min-height: 100%;
1523
- font-size: 13px;
1524
- line-height: 1.7;
1525
- color: #d7def8;
1526
- }
1527
-
1528
- .task-output-body.markdown-body p,
1529
- .task-output-body.markdown-body li,
1530
- .task-output-body.markdown-body blockquote,
1531
- .task-output-body.markdown-body td,
1532
- .task-output-body.markdown-body th,
1533
- .task-output-body.markdown-body strong {
1534
- color: inherit;
1535
- }
1536
-
1537
- .task-output-body.markdown-body a {
1538
- color: #93c5fd;
1539
- }
1540
-
1541
- .task-output-body.markdown-body blockquote {
1542
- background: rgba(147, 197, 253, 0.08);
1543
- border-left-color: #60a5fa;
1544
- }
1545
-
1546
2232
  .task-detail-empty {
1547
2233
  border: 1px dashed var(--border);
1548
2234
  border-radius: var(--radius);