pixelcrew 0.1.1 → 0.1.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelcrew",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Local multi-agent orchestration framework with an interactive pixel-art tech startup office visual dashboard",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -830,6 +830,78 @@ function renderReportsList() {
830
830
  });
831
831
  }
832
832
 
833
+ function formatMarkdownText(text) {
834
+ if (!text) return '';
835
+ let html = escapeHtml(text);
836
+
837
+ // Bold: **text** or __text__
838
+ html = html.replace(/\*\*(.*?)\*\*/g, '<strong class="report-bold">$1</strong>');
839
+ html = html.replace(/__(.*?)__/g, '<strong class="report-bold">$1</strong>');
840
+
841
+ // Inline Code: `code`
842
+ html = html.replace(/`([^`]+)`/g, '<code class="report-inline-code">$1</code>');
843
+
844
+ // Italic: *text* or _text_
845
+ html = html.replace(/\*([^*]+)\*/g, '<em class="report-italic">$1</em>');
846
+ html = html.replace(/_([^_]+)_/g, '<em class="report-italic">$1</em>');
847
+
848
+ return html;
849
+ }
850
+
851
+ function parseFindingItem(finding) {
852
+ let rawCategory = (finding.category || '').trim();
853
+ let rawDesc = (finding.description || '').trim();
854
+
855
+ let combined = rawDesc;
856
+ if (!rawDesc || rawDesc === rawCategory) {
857
+ combined = rawCategory;
858
+ } else if (rawCategory && rawDesc) {
859
+ combined = `${rawCategory}: ${rawDesc}`;
860
+ }
861
+
862
+ let badge = 'Finding';
863
+ let path = null;
864
+ let description = combined;
865
+
866
+ // 1. Extract markdown bold badge if present: **Title (`path`)** or **Title**
867
+ const boldPrefixMatch = combined.match(/^(\*\*|__)?([^*_`:]+?)(?:\s*\(`?([^`)]+?)`?\))?(\*\*|__)?(?::\s*|\s*-\s*|\s*—\s*)(.*)$/s);
868
+ if (boldPrefixMatch) {
869
+ badge = boldPrefixMatch[2].replace(/\*\*/g, '').trim();
870
+ path = boldPrefixMatch[3] ? boldPrefixMatch[3].trim() : null;
871
+ description = boldPrefixMatch[5] ? boldPrefixMatch[5].trim() : '';
872
+ } else {
873
+ // 2. Check if category itself contains title and path
874
+ const catMatch = rawCategory.match(/^(\*\*|__)?([^*_`:]+?)(?:\s*\(`?([^`)]+?)`?\))?(\*\*|__)?$/);
875
+ if (catMatch) {
876
+ badge = catMatch[2].replace(/\*\*/g, '').trim();
877
+ path = catMatch[3] ? catMatch[3].trim() : null;
878
+ description = rawDesc;
879
+ } else {
880
+ const colonIndex = combined.indexOf(':');
881
+ if (colonIndex > 0 && colonIndex < 45) {
882
+ let rawTitle = combined.substring(0, colonIndex).replace(/\*\*/g, '').replace(/__/g, '').trim();
883
+ const pathMatch = rawTitle.match(/^(.*?)(?:\s*\(`?([^`)]+?)`?\))$/);
884
+ if (pathMatch) {
885
+ badge = pathMatch[1].trim();
886
+ path = pathMatch[2].trim();
887
+ } else {
888
+ badge = rawTitle;
889
+ }
890
+ description = combined.substring(colonIndex + 1).trim();
891
+ }
892
+ }
893
+ }
894
+
895
+ badge = badge.replace(/\*\*/g, '').replace(/`/g, '').trim();
896
+ if (!badge) badge = 'Observation';
897
+
898
+ return {
899
+ badge,
900
+ path,
901
+ descriptionHtml: formatMarkdownText(description || combined)
902
+ };
903
+ }
904
+
833
905
  function renderActiveReport() {
834
906
  const viewer = document.getElementById('reportsViewer');
835
907
  if (!viewer) return;
@@ -840,7 +912,7 @@ function renderActiveReport() {
840
912
  <div class="report-empty-state">
841
913
  <span style="font-size: 32px;">📋</span>
842
914
  <span>SELECT A SPRINT REPORT FROM THE LEFT SIDEBAR</span>
843
- <span style="color: var(--text-dim); font-size: 10px;">Audit reports are generated automatically after every completed swarm run.</span>
915
+ <span style="color: var(--text-dim); font-size: 11px;">Audit reports are generated automatically after every completed swarm run.</span>
844
916
  </div>
845
917
  `;
846
918
  return;
@@ -854,8 +926,8 @@ function renderActiveReport() {
854
926
  <div>
855
927
  <h3 class="report-hero-title">RAW MARKDOWN SPECIFICATION</h3>
856
928
  <div class="report-hero-meta">
857
- <span>PROJECT: <strong>${report.project || 'Project'}</strong></span>
858
- <span>DATE: <strong>${report.dateFormatted || 'N/A'}</strong></span>
929
+ <span>PROJECT: <strong>${escapeHtml(report.project || 'Project')}</strong></span>
930
+ <span>DATE: <strong>${escapeHtml(report.dateFormatted || 'N/A')}</strong></span>
859
931
  </div>
860
932
  </div>
861
933
  </div>
@@ -878,7 +950,7 @@ function renderActiveReport() {
878
950
  <span>SQUADS: <strong>${(report.targetAgents || []).map(a => a.toUpperCase()).join(', ')}</strong></span>
879
951
  </div>
880
952
  </div>
881
- <span class="report-item-status" style="font-size: 10px; padding: 4px 8px;">100% COMPLETE</span>
953
+ <span class="report-item-status">COMPLETED</span>
882
954
  </div>
883
955
  <div class="report-summary-box">
884
956
  <strong>Executive Summary:</strong> The autonomous engineering swarm executed an architectural and quality audit, resolving dependencies and formulating <strong>${report.totalFindings || 0} actionable improvements</strong>.
@@ -907,22 +979,39 @@ function renderActiveReport() {
907
979
 
908
980
  <!-- SQUAD FINDINGS ACCORDION / CARDS -->
909
981
  <div class="report-sections-grid">
910
- ${(report.sections || []).map(section => `
911
- <div class="report-squad-card" style="border-left: 4px solid ${section.color || '#00f0ff'};">
912
- <div class="report-squad-header" style="color: ${section.color || '#00f0ff'};">
913
- <span>${section.icon || '💼'}</span>
914
- <span>${escapeHtml(section.name || section.agent.toUpperCase())}</span>
982
+ ${(report.sections || []).map(section => {
983
+ const squadColor = section.color || '#00f0ff';
984
+ const findings = section.findings || [];
985
+ return `
986
+ <div class="report-squad-card" style="border-left: 4px solid ${squadColor};">
987
+ <div class="report-squad-header">
988
+ <div class="report-squad-header-left" style="color: ${squadColor};">
989
+ <span>${section.icon || '💼'}</span>
990
+ <span>${escapeHtml(section.name || section.agent.toUpperCase())}</span>
991
+ </div>
992
+ <span class="report-squad-count">${findings.length} ${findings.length === 1 ? 'Point' : 'Points'}</span>
915
993
  </div>
916
994
  <div class="report-findings-list">
917
- ${(section.findings || []).map(f => `
918
- <div class="report-finding-item">
919
- <span class="finding-pill" style="border-color: ${section.color || '#00f0ff'}; color: ${section.color || '#00f0ff'};">${escapeHtml(f.category || 'Finding')}</span>
920
- <span class="finding-desc">${escapeHtml(f.description || '')}</span>
995
+ ${findings.map(f => {
996
+ const parsed = parseFindingItem(f);
997
+ return `
998
+ <div class="report-finding-card">
999
+ <div class="finding-card-header">
1000
+ <span class="finding-badge" style="background: rgba(0, 240, 255, 0.08); border-color: ${squadColor}40; color: ${squadColor};">
1001
+ ${escapeHtml(parsed.badge)}
1002
+ </span>
1003
+ ${parsed.path ? `<span class="finding-path-pill"><code>${escapeHtml(parsed.path)}</code></span>` : ''}
1004
+ </div>
1005
+ <div class="finding-body-text">
1006
+ ${parsed.descriptionHtml}
1007
+ </div>
921
1008
  </div>
922
- `).join('')}
1009
+ `;
1010
+ }).join('')}
923
1011
  </div>
924
1012
  </div>
925
- `).join('')}
1013
+ `;
1014
+ }).join('')}
926
1015
  </div>
927
1016
 
928
1017
  <!-- ACTION ITEMS CHECKLIST -->
@@ -932,7 +1021,7 @@ function renderActiveReport() {
932
1021
  ${(report.actionItems || []).map(item => `
933
1022
  <label class="report-check-item">
934
1023
  <input type="checkbox" />
935
- <span>${escapeHtml(item)}</span>
1024
+ <span>${formatMarkdownText(item)}</span>
936
1025
  </label>
937
1026
  `).join('')}
938
1027
  </div>
@@ -842,14 +842,23 @@ body:not(.crt-active) .crt-vignette {
842
842
  font-size: 16px;
843
843
  }
844
844
 
845
- /* Reports Modal & History Drawer */
845
+ /* ==========================================================================
846
+ SPRINT AUDIT REPORTS & HISTORY DRAWER (MODERN HIGH-LEGIBILITY UI)
847
+ ========================================================================== */
848
+
846
849
  .reports-modal-card {
847
- max-width: 1100px;
850
+ max-width: 1120px;
848
851
  width: 95vw;
849
- height: 82vh;
850
- max-height: 850px;
852
+ height: 85vh;
853
+ max-height: 900px;
851
854
  display: flex;
852
855
  flex-direction: column;
856
+ border: 2px solid var(--border-black);
857
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.8), var(--pixel-shadow);
858
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Inter", sans-serif;
859
+ text-transform: none;
860
+ letter-spacing: normal;
861
+ -webkit-font-smoothing: antialiased;
853
862
  }
854
863
 
855
864
  .reports-header-actions {
@@ -862,88 +871,106 @@ body:not(.crt-active) .crt-vignette {
862
871
  display: flex;
863
872
  flex: 1;
864
873
  overflow: hidden;
865
- background: var(--bg-dark);
874
+ background: #090c15;
866
875
  }
867
876
 
877
+ /* Sidebar History List */
868
878
  .reports-sidebar {
869
879
  width: 320px;
870
880
  min-width: 280px;
871
- background: var(--bg-panel-dark);
872
- border-right: 2px solid var(--border-black);
881
+ background: #0d101d;
882
+ border-right: 1px solid #1f2742;
873
883
  display: flex;
874
884
  flex-direction: column;
875
885
  }
876
886
 
877
887
  .reports-search-box {
878
- padding: 10px;
879
- border-bottom: 2px solid var(--border-black);
880
- background: var(--bg-panel);
888
+ padding: 12px;
889
+ border-bottom: 1px solid #1f2742;
890
+ background: #111526;
881
891
  }
882
892
 
883
893
  .reports-search-input {
884
894
  width: 100%;
885
- font-size: 11px;
886
- padding: 6px 8px;
895
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
896
+ font-size: 13px;
897
+ padding: 8px 12px;
898
+ background: #090c16;
899
+ border: 1px solid #283254;
900
+ color: #f1f5f9;
901
+ border-radius: 4px;
902
+ outline: none;
903
+ transition: border-color 0.15s ease;
904
+ }
905
+
906
+ .reports-search-input:focus {
907
+ border-color: var(--color-cyan);
887
908
  }
888
909
 
889
910
  .reports-history-list {
890
911
  flex: 1;
891
912
  overflow-y: auto;
892
- padding: 8px;
913
+ padding: 10px;
893
914
  display: flex;
894
915
  flex-direction: column;
895
- gap: 6px;
916
+ gap: 8px;
896
917
  }
897
918
 
898
919
  .report-item-card {
899
- background: var(--bg-card);
900
- border: 2px solid var(--border-color);
901
- padding: 10px;
920
+ background: #13182b;
921
+ border: 1px solid #202947;
922
+ border-radius: 6px;
923
+ padding: 12px;
902
924
  cursor: pointer;
903
925
  transition: all 0.15s ease;
904
926
  display: flex;
905
927
  flex-direction: column;
906
- gap: 6px;
928
+ gap: 8px;
929
+ text-align: left;
907
930
  }
908
931
 
909
932
  .report-item-card:hover {
910
- background: var(--bg-card-hover);
911
- border-color: var(--color-cyan);
912
- transform: translateX(2px);
933
+ background: #192038;
934
+ border-color: #3b82f6;
935
+ transform: translateY(-1px);
913
936
  }
914
937
 
915
938
  .report-item-card.active {
916
- background: #17213c;
939
+ background: #192342;
917
940
  border-color: var(--color-cyan);
918
- box-shadow: inset 3px 0 0 var(--color-cyan);
941
+ box-shadow: 0 0 0 1px var(--color-cyan), inset 3px 0 0 var(--color-cyan);
919
942
  }
920
943
 
921
944
  .report-item-top {
922
945
  display: flex;
923
946
  justify-content: space-between;
924
947
  align-items: center;
948
+ gap: 8px;
925
949
  }
926
950
 
927
951
  .report-item-date {
928
- font-size: 9px;
929
- color: var(--text-dim);
930
- font-family: var(--font-pixel);
952
+ font-size: 11px;
953
+ color: #94a3b8;
954
+ font-weight: 500;
931
955
  }
932
956
 
933
957
  .report-item-status {
934
- font-size: 8px;
935
- padding: 2px 5px;
936
- background: rgba(57, 255, 20, 0.15);
937
- color: var(--color-green);
938
- border: 1px solid var(--color-green);
939
- font-family: var(--font-pixel);
958
+ font-size: 10px;
959
+ font-weight: 700;
960
+ padding: 2px 6px;
961
+ background: rgba(34, 197, 94, 0.12);
962
+ color: #4ade80;
963
+ border: 1px solid rgba(34, 197, 94, 0.3);
964
+ border-radius: 3px;
965
+ text-transform: uppercase;
966
+ letter-spacing: 0.5px;
940
967
  }
941
968
 
942
969
  .report-item-title {
943
- font-size: 11px;
944
- color: var(--text-bright);
945
- font-weight: bold;
946
- line-height: 1.3;
970
+ font-size: 13px;
971
+ color: #f8fafc;
972
+ font-weight: 600;
973
+ line-height: 1.4;
947
974
  display: -webkit-box;
948
975
  -webkit-line-clamp: 2;
949
976
  -webkit-box-orient: vertical;
@@ -953,19 +980,21 @@ body:not(.crt-active) .crt-vignette {
953
980
  .report-item-meta {
954
981
  display: flex;
955
982
  justify-content: space-between;
956
- font-size: 10px;
957
- color: var(--text-dim);
983
+ font-size: 11px;
984
+ color: #64748b;
958
985
  }
959
986
 
960
- /* Reports Viewer (Right Pane) */
987
+ /* Reports Viewer (Right Detail Pane) */
961
988
  .reports-viewer {
962
989
  flex: 1;
963
990
  overflow-y: auto;
964
- padding: 20px;
991
+ padding: 24px 28px;
965
992
  display: flex;
966
993
  flex-direction: column;
967
- gap: 16px;
968
- background: var(--bg-panel);
994
+ gap: 20px;
995
+ background: #090c15;
996
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Inter", sans-serif;
997
+ color: #e2e8f0;
969
998
  }
970
999
 
971
1000
  .report-empty-state {
@@ -974,195 +1003,293 @@ body:not(.crt-active) .crt-vignette {
974
1003
  align-items: center;
975
1004
  justify-content: center;
976
1005
  height: 100%;
977
- color: var(--text-dim);
1006
+ color: #64748b;
978
1007
  gap: 12px;
979
1008
  text-align: center;
980
- font-family: var(--font-pixel);
981
- font-size: 11px;
1009
+ font-size: 14px;
982
1010
  }
983
1011
 
1012
+ /* Hero Header Card */
984
1013
  .report-hero-card {
985
- background: linear-gradient(135deg, #182038 0%, #101526 100%);
986
- border: 2px solid var(--color-cyan);
987
- padding: 16px;
1014
+ background: linear-gradient(135deg, #13192f 0%, #0d1222 100%);
1015
+ border: 1px solid #2b3860;
1016
+ border-radius: 8px;
1017
+ padding: 20px;
988
1018
  display: flex;
989
1019
  flex-direction: column;
990
- gap: 10px;
991
- box-shadow: var(--pixel-shadow);
1020
+ gap: 12px;
1021
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
992
1022
  }
993
1023
 
994
1024
  .report-hero-header {
995
1025
  display: flex;
996
1026
  justify-content: space-between;
997
1027
  align-items: flex-start;
998
- gap: 12px;
1028
+ gap: 16px;
999
1029
  }
1000
1030
 
1001
1031
  .report-hero-title {
1002
- font-family: var(--font-pixel);
1003
- font-size: 13px;
1004
- color: var(--color-cyan);
1005
- line-height: 1.4;
1032
+ font-size: 18px;
1033
+ font-weight: 700;
1034
+ color: #ffffff;
1035
+ line-height: 1.35;
1036
+ letter-spacing: -0.01em;
1006
1037
  }
1007
1038
 
1008
1039
  .report-hero-meta {
1009
1040
  display: flex;
1010
1041
  flex-wrap: wrap;
1011
- gap: 12px;
1012
- font-size: 10px;
1013
- color: var(--text-dim);
1014
- font-family: var(--font-pixel);
1015
- margin-top: 4px;
1042
+ gap: 16px;
1043
+ font-size: 12px;
1044
+ color: #94a3b8;
1045
+ margin-top: 6px;
1046
+ }
1047
+
1048
+ .report-hero-meta span {
1049
+ display: inline-flex;
1050
+ align-items: center;
1051
+ gap: 4px;
1016
1052
  }
1017
1053
 
1018
1054
  .report-hero-meta strong {
1019
- color: var(--text-bright);
1055
+ color: #f1f5f9;
1056
+ font-weight: 600;
1020
1057
  }
1021
1058
 
1022
1059
  .report-summary-box {
1023
- background: rgba(0, 0, 0, 0.4);
1024
- border-left: 3px solid var(--color-gold);
1025
- padding: 10px 12px;
1026
- font-size: 12px;
1027
- color: var(--text-main);
1028
- line-height: 1.5;
1060
+ background: rgba(0, 0, 0, 0.45);
1061
+ border-left: 3px solid var(--color-cyan);
1062
+ border-radius: 0 4px 4px 0;
1063
+ padding: 12px 14px;
1064
+ font-size: 13.5px;
1065
+ color: #cbd5e1;
1066
+ line-height: 1.6;
1029
1067
  }
1030
1068
 
1031
- /* Report Metrics Grid */
1069
+ /* Metric KPI Cards */
1032
1070
  .report-metrics-grid {
1033
1071
  display: grid;
1034
- grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
1035
- gap: 10px;
1072
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1073
+ gap: 12px;
1036
1074
  }
1037
1075
 
1038
1076
  .report-metric-card {
1039
- background: var(--bg-card);
1040
- border: 2px solid var(--border-black);
1041
- padding: 10px;
1077
+ background: #111627;
1078
+ border: 1px solid #1e2744;
1079
+ border-radius: 6px;
1080
+ padding: 12px 14px;
1042
1081
  display: flex;
1043
1082
  flex-direction: column;
1044
1083
  gap: 4px;
1045
- align-items: center;
1046
- text-align: center;
1084
+ text-align: left;
1047
1085
  }
1048
1086
 
1049
1087
  .report-metric-label {
1050
- font-size: 9px;
1051
- color: var(--text-dim);
1052
- font-family: var(--font-pixel);
1088
+ font-size: 10.5px;
1089
+ font-weight: 600;
1090
+ color: #64748b;
1091
+ text-transform: uppercase;
1092
+ letter-spacing: 0.5px;
1053
1093
  }
1054
1094
 
1055
1095
  .report-metric-val {
1056
- font-size: 18px;
1057
- color: var(--color-gold);
1058
- font-family: var(--font-terminal);
1059
- font-weight: bold;
1096
+ font-size: 20px;
1097
+ font-weight: 700;
1098
+ color: #f8fafc;
1099
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
1060
1100
  }
1061
1101
 
1062
- /* Squad Findings Cards */
1102
+ /* Squad Section Cards */
1063
1103
  .report-sections-grid {
1064
1104
  display: flex;
1065
1105
  flex-direction: column;
1066
- gap: 12px;
1106
+ gap: 16px;
1067
1107
  }
1068
1108
 
1069
1109
  .report-squad-card {
1070
- background: var(--bg-card);
1071
- border: 2px solid var(--border-color);
1072
- padding: 14px;
1110
+ background: #111526;
1111
+ border: 1px solid #1f2746;
1112
+ border-radius: 8px;
1113
+ padding: 18px 20px;
1073
1114
  display: flex;
1074
1115
  flex-direction: column;
1075
- gap: 10px;
1116
+ gap: 14px;
1117
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
1076
1118
  }
1077
1119
 
1078
1120
  .report-squad-header {
1121
+ display: flex;
1122
+ align-items: center;
1123
+ justify-content: space-between;
1124
+ font-size: 14px;
1125
+ font-weight: 700;
1126
+ padding-bottom: 10px;
1127
+ border-bottom: 1px solid #1a223c;
1128
+ }
1129
+
1130
+ .report-squad-header-left {
1079
1131
  display: flex;
1080
1132
  align-items: center;
1081
1133
  gap: 8px;
1082
- font-family: var(--font-pixel);
1134
+ }
1135
+
1136
+ .report-squad-count {
1083
1137
  font-size: 11px;
1084
- padding-bottom: 6px;
1085
- border-bottom: 1px solid var(--border-color);
1138
+ font-weight: 600;
1139
+ padding: 2px 8px;
1140
+ background: rgba(255, 255, 255, 0.06);
1141
+ border-radius: 12px;
1142
+ color: #94a3b8;
1086
1143
  }
1087
1144
 
1088
1145
  .report-findings-list {
1146
+ display: flex;
1147
+ flex-direction: column;
1148
+ gap: 10px;
1149
+ }
1150
+
1151
+ /* Individual Finding Item */
1152
+ .report-finding-card {
1153
+ background: #0b0e1a;
1154
+ border: 1px solid #1a223c;
1155
+ border-radius: 6px;
1156
+ padding: 12px 14px;
1089
1157
  display: flex;
1090
1158
  flex-direction: column;
1091
1159
  gap: 8px;
1160
+ transition: border-color 0.15s ease;
1092
1161
  }
1093
1162
 
1094
- .report-finding-item {
1163
+ .report-finding-card:hover {
1164
+ border-color: #2e3b63;
1165
+ }
1166
+
1167
+ .finding-card-header {
1095
1168
  display: flex;
1096
- align-items: flex-start;
1169
+ flex-wrap: wrap;
1170
+ align-items: center;
1097
1171
  gap: 8px;
1098
- font-size: 12px;
1099
- line-height: 1.4;
1100
1172
  }
1101
1173
 
1102
- .finding-pill {
1103
- font-size: 9px;
1104
- padding: 2px 6px;
1105
- background: #0d1222;
1106
- border: 1px solid #33406a;
1174
+ .finding-badge {
1175
+ font-size: 11.5px;
1176
+ font-weight: 600;
1177
+ padding: 3px 8px;
1178
+ border-radius: 4px;
1179
+ background: rgba(0, 240, 255, 0.08);
1180
+ border: 1px solid rgba(0, 240, 255, 0.25);
1107
1181
  color: var(--color-cyan);
1108
- font-family: var(--font-pixel);
1109
- white-space: nowrap;
1182
+ display: inline-flex;
1183
+ align-items: center;
1110
1184
  }
1111
1185
 
1112
- .finding-desc {
1113
- color: var(--text-main);
1114
- flex: 1;
1186
+ .finding-path-pill {
1187
+ font-size: 11.5px;
1188
+ background: #141b2e;
1189
+ border: 1px solid #232d4b;
1190
+ border-radius: 4px;
1191
+ padding: 2px 8px;
1192
+ color: #93c5fd;
1193
+ font-family: 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace;
1194
+ }
1195
+
1196
+ .finding-path-pill code {
1197
+ color: inherit;
1198
+ background: transparent;
1199
+ padding: 0;
1200
+ font-family: inherit;
1201
+ }
1202
+
1203
+ .finding-body-text {
1204
+ font-size: 13.5px;
1205
+ line-height: 1.6;
1206
+ color: #cbd5e1;
1207
+ text-align: left;
1208
+ }
1209
+
1210
+ /* Inline Markdown Styling */
1211
+ .report-bold {
1212
+ font-weight: 600;
1213
+ color: #ffffff;
1214
+ }
1215
+
1216
+ .report-inline-code {
1217
+ background: #1e293b;
1218
+ color: #38bdf8;
1219
+ font-family: 'JetBrains Mono', Menlo, Consolas, monospace;
1220
+ font-size: 12px;
1221
+ padding: 2px 5px;
1222
+ border-radius: 3px;
1223
+ border: 1px solid rgba(255, 255, 255, 0.08);
1224
+ }
1225
+
1226
+ .report-italic {
1227
+ font-style: italic;
1228
+ color: #94a3b8;
1115
1229
  }
1116
1230
 
1117
1231
  /* Action Items Checklist */
1118
1232
  .report-actions-card {
1119
- background: #141a2e;
1120
- border: 2px solid var(--color-gold);
1121
- padding: 14px;
1233
+ background: #111526;
1234
+ border: 1px solid rgba(255, 215, 0, 0.3);
1235
+ border-radius: 8px;
1236
+ padding: 18px 20px;
1122
1237
  display: flex;
1123
1238
  flex-direction: column;
1124
- gap: 10px;
1239
+ gap: 12px;
1125
1240
  }
1126
1241
 
1127
1242
  .report-actions-title {
1128
- font-family: var(--font-pixel);
1129
- font-size: 11px;
1243
+ font-size: 14px;
1244
+ font-weight: 700;
1130
1245
  color: var(--color-gold);
1246
+ display: flex;
1247
+ align-items: center;
1248
+ gap: 6px;
1131
1249
  }
1132
1250
 
1133
1251
  .report-checklist {
1134
1252
  display: flex;
1135
1253
  flex-direction: column;
1136
- gap: 8px;
1254
+ gap: 10px;
1137
1255
  }
1138
1256
 
1139
1257
  .report-check-item {
1140
1258
  display: flex;
1141
- align-items: center;
1142
- gap: 8px;
1143
- font-size: 12px;
1144
- color: var(--text-main);
1259
+ align-items: flex-start;
1260
+ gap: 10px;
1261
+ font-size: 13.5px;
1262
+ color: #e2e8f0;
1263
+ line-height: 1.5;
1264
+ cursor: pointer;
1265
+ user-select: none;
1145
1266
  }
1146
1267
 
1147
1268
  .report-check-item input[type="checkbox"] {
1148
1269
  accent-color: var(--color-gold);
1149
1270
  width: 16px;
1150
1271
  height: 16px;
1272
+ margin-top: 3px;
1151
1273
  cursor: pointer;
1152
1274
  }
1153
1275
 
1276
+ .report-check-item span {
1277
+ flex: 1;
1278
+ }
1279
+
1154
1280
  /* Raw Markdown Viewer Mode */
1155
1281
  .report-raw-pre {
1156
- background: #090c16;
1157
- border: 2px solid var(--border-black);
1158
- padding: 16px;
1159
- color: #a5b4fc;
1160
- font-family: var(--font-terminal);
1161
- font-size: 16px;
1162
- line-height: 1.5;
1282
+ background: #060810;
1283
+ border: 1px solid #1f2742;
1284
+ border-radius: 6px;
1285
+ padding: 18px;
1286
+ color: #93c5fd;
1287
+ font-family: 'JetBrains Mono', Menlo, Consolas, monospace;
1288
+ font-size: 13px;
1289
+ line-height: 1.6;
1163
1290
  white-space: pre-wrap;
1164
1291
  word-break: break-word;
1165
- max-height: 60vh;
1292
+ max-height: 65vh;
1166
1293
  overflow-y: auto;
1167
1294
  }
1168
1295
 
@@ -34,7 +34,7 @@ export function createServer(engine, options = {}) {
34
34
  }
35
35
  });
36
36
 
37
- // Watch events.jsonl for direct external CLI writes (e.g. from Antigravity IDE)
37
+ // Watch events.jsonl for direct external CLI / IDE writes
38
38
  let lastKnownEventCount = 0;
39
39
  if (engine.eventsPath) {
40
40
  try {
@@ -44,7 +44,7 @@ export function createServer(engine, options = {}) {
44
44
  lastKnownEventCount = 0;
45
45
  }
46
46
 
47
- fsSync.watchFile(engine.eventsPath, { interval: 300 }, async () => {
47
+ fsSync.watchFile(engine.eventsPath, { interval: 150 }, async () => {
48
48
  try {
49
49
  const content = await fs.readFile(engine.eventsPath, 'utf-8');
50
50
  const lines = content.trim().split('\n').filter(Boolean);
@@ -54,7 +54,11 @@ export function createServer(engine, options = {}) {
54
54
  for (const line of newLines) {
55
55
  try {
56
56
  const event = JSON.parse(line);
57
- // Broadcast over SSE
57
+ // Update in-memory event history
58
+ engine.eventHistory.push(event);
59
+ if (engine.eventHistory.length > 200) engine.eventHistory.shift();
60
+
61
+ // Broadcast over SSE immediately
58
62
  const payload = `event: agent_event\ndata: ${JSON.stringify(event)}\n\n`;
59
63
  for (const client of sseClients) {
60
64
  try { client.write(payload); } catch {}
@@ -66,6 +70,21 @@ export function createServer(engine, options = {}) {
66
70
  });
67
71
  }
68
72
 
73
+ // Watch state.json for direct external updates
74
+ if (engine.statePath) {
75
+ fsSync.watchFile(engine.statePath, { interval: 150 }, async () => {
76
+ try {
77
+ const content = await fs.readFile(engine.statePath, 'utf-8');
78
+ const state = JSON.parse(content);
79
+ engine.state = state;
80
+ const payload = `event: state_change\ndata: ${JSON.stringify({ state })}\n\n`;
81
+ for (const client of sseClients) {
82
+ try { client.write(payload); } catch {}
83
+ }
84
+ } catch {}
85
+ });
86
+ }
87
+
69
88
  const server = http.createServer(async (req, res) => {
70
89
  // Enable CORS
71
90
  res.setHeader('Access-Control-Allow-Origin', '*');