diff --git a/.beads/dolt-server.log b/.beads/dolt-server.log index 58e9ced..4a4bdff 100644 --- a/.beads/dolt-server.log +++ b/.beads/dolt-server.log @@ -88153,3 +88153,122 @@ time="2026-03-05T16:27:11-08:00" level=info msg=NewConnection DisableClientMulti time="2026-03-05T16:27:11-08:00" level=info msg=ConnectionClosed connectionID=1155 time="2026-03-05T16:27:11-08:00" level=error msg="Error reading packet from client 1156 (127.0.0.1:49574): read tcp 127.0.0.1:3307->127.0.0.1:49574: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" time="2026-03-05T16:27:11-08:00" level=info msg=ConnectionClosed connectionID=1156 +time="2026-03-05T16:33:10-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1157 +time="2026-03-05T16:33:10-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:58438: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1157" +time="2026-03-05T16:33:10-08:00" level=info msg=ConnectionClosed connectionID=1157 +time="2026-03-05T16:33:10-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1158 +time="2026-03-05T16:33:10-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1159 +time="2026-03-05T16:33:10-08:00" level=info msg=ConnectionClosed connectionID=1158 +time="2026-03-05T16:33:10-08:00" level=error msg="Error reading packet from client 1159 (127.0.0.1:58440): read tcp 127.0.0.1:3307->127.0.0.1:58440: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:33:10-08:00" level=info msg=ConnectionClosed connectionID=1159 +time="2026-03-05T16:33:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1160 +time="2026-03-05T16:33:11-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:58442: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1160" +time="2026-03-05T16:33:11-08:00" level=info msg=ConnectionClosed connectionID=1160 +time="2026-03-05T16:33:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1161 +time="2026-03-05T16:33:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1162 +time="2026-03-05T16:33:11-08:00" level=info msg=ConnectionClosed connectionID=1161 +time="2026-03-05T16:33:11-08:00" level=error msg="Error reading packet from client 1162 (127.0.0.1:58444): read tcp 127.0.0.1:3307->127.0.0.1:58444: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:33:11-08:00" level=info msg=ConnectionClosed connectionID=1162 +time="2026-03-05T16:33:28-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1163 +time="2026-03-05T16:33:28-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:58504: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1163" +time="2026-03-05T16:33:28-08:00" level=info msg=ConnectionClosed connectionID=1163 +time="2026-03-05T16:33:28-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1164 +time="2026-03-05T16:33:28-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1165 +time="2026-03-05T16:33:28-08:00" level=info msg=ConnectionClosed connectionID=1164 +time="2026-03-05T16:33:28-08:00" level=error msg="Error reading packet from client 1165 (127.0.0.1:58506): read tcp 127.0.0.1:3307->127.0.0.1:58506: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:33:28-08:00" level=info msg=ConnectionClosed connectionID=1165 +time="2026-03-05T16:33:59-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1166 +time="2026-03-05T16:33:59-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:65166: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1166" +time="2026-03-05T16:33:59-08:00" level=info msg=ConnectionClosed connectionID=1166 +time="2026-03-05T16:33:59-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1167 +time="2026-03-05T16:33:59-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1168 +time="2026-03-05T16:33:59-08:00" level=info msg=ConnectionClosed connectionID=1167 +time="2026-03-05T16:33:59-08:00" level=error msg="Error reading packet from client 1168 (127.0.0.1:65168): read tcp 127.0.0.1:3307->127.0.0.1:65168: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:33:59-08:00" level=info msg=ConnectionClosed connectionID=1168 +time="2026-03-05T16:34:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1169 +time="2026-03-05T16:34:11-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:62725: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1169" +time="2026-03-05T16:34:11-08:00" level=info msg=ConnectionClosed connectionID=1169 +time="2026-03-05T16:34:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1170 +time="2026-03-05T16:34:11-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1171 +time="2026-03-05T16:34:11-08:00" level=info msg=ConnectionClosed connectionID=1170 +time="2026-03-05T16:34:11-08:00" level=error msg="Error reading packet from client 1171 (127.0.0.1:62727): read tcp 127.0.0.1:3307->127.0.0.1:62727: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:34:11-08:00" level=info msg=ConnectionClosed connectionID=1171 +time="2026-03-05T16:54:03-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1172 +time="2026-03-05T16:54:03-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:65417: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1172" +time="2026-03-05T16:54:03-08:00" level=info msg=ConnectionClosed connectionID=1172 +time="2026-03-05T16:54:03-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1173 +time="2026-03-05T16:54:03-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1174 +time="2026-03-05T16:54:03-08:00" level=info msg=ConnectionClosed connectionID=1173 +time="2026-03-05T16:54:03-08:00" level=error msg="Error reading packet from client 1174 (127.0.0.1:65421): read tcp 127.0.0.1:3307->127.0.0.1:65421: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:54:03-08:00" level=info msg=ConnectionClosed connectionID=1174 +time="2026-03-05T16:54:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1175 +time="2026-03-05T16:54:04-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:65425: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1175" +time="2026-03-05T16:54:04-08:00" level=info msg=ConnectionClosed connectionID=1175 +time="2026-03-05T16:54:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1176 +time="2026-03-05T16:54:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1177 +time="2026-03-05T16:54:04-08:00" level=info msg=ConnectionClosed connectionID=1176 +time="2026-03-05T16:54:04-08:00" level=error msg="Error reading packet from client 1177 (127.0.0.1:65427): read tcp 127.0.0.1:3307->127.0.0.1:65427: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:54:04-08:00" level=info msg=ConnectionClosed connectionID=1177 +time="2026-03-05T16:54:05-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1178 +time="2026-03-05T16:54:05-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:65437: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1178" +time="2026-03-05T16:54:05-08:00" level=info msg=ConnectionClosed connectionID=1178 +time="2026-03-05T16:54:05-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1179 +time="2026-03-05T16:54:05-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1180 +time="2026-03-05T16:54:05-08:00" level=info msg=ConnectionClosed connectionID=1179 +time="2026-03-05T16:54:06-08:00" level=error msg="Error reading packet from client 1180 (127.0.0.1:65439): read tcp 127.0.0.1:3307->127.0.0.1:65439: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:54:06-08:00" level=info msg=ConnectionClosed connectionID=1180 +time="2026-03-05T16:54:17-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1181 +time="2026-03-05T16:54:17-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:65490: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1181" +time="2026-03-05T16:54:17-08:00" level=info msg=ConnectionClosed connectionID=1181 +time="2026-03-05T16:54:17-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1182 +time="2026-03-05T16:54:17-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1183 +time="2026-03-05T16:54:17-08:00" level=info msg=ConnectionClosed connectionID=1182 +time="2026-03-05T16:54:17-08:00" level=error msg="Error reading packet from client 1183 (127.0.0.1:65492): read tcp 127.0.0.1:3307->127.0.0.1:65492: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T16:54:17-08:00" level=info msg=ConnectionClosed connectionID=1183 +time="2026-03-05T17:07:38-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1184 +time="2026-03-05T17:07:38-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:62939: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1184" +time="2026-03-05T17:07:38-08:00" level=info msg=ConnectionClosed connectionID=1184 +time="2026-03-05T17:07:38-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1185 +time="2026-03-05T17:07:38-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1186 +time="2026-03-05T17:07:38-08:00" level=info msg=ConnectionClosed connectionID=1185 +time="2026-03-05T17:07:38-08:00" level=error msg="Error reading packet from client 1186 (127.0.0.1:62941): read tcp 127.0.0.1:3307->127.0.0.1:62941: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:07:38-08:00" level=info msg=ConnectionClosed connectionID=1186 +time="2026-03-05T17:07:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1187 +time="2026-03-05T17:07:39-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:51196: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1187" +time="2026-03-05T17:07:39-08:00" level=info msg=ConnectionClosed connectionID=1187 +time="2026-03-05T17:07:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1188 +time="2026-03-05T17:07:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1189 +time="2026-03-05T17:07:39-08:00" level=info msg=ConnectionClosed connectionID=1188 +time="2026-03-05T17:07:39-08:00" level=error msg="Error reading packet from client 1189 (127.0.0.1:51198): read tcp 127.0.0.1:3307->127.0.0.1:51198: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:07:39-08:00" level=info msg=ConnectionClosed connectionID=1189 +time="2026-03-05T17:07:41-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1190 +time="2026-03-05T17:07:41-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:51214: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1190" +time="2026-03-05T17:07:41-08:00" level=info msg=ConnectionClosed connectionID=1190 +time="2026-03-05T17:07:41-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1191 +time="2026-03-05T17:07:41-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1192 +time="2026-03-05T17:07:41-08:00" level=info msg=ConnectionClosed connectionID=1191 +time="2026-03-05T17:07:41-08:00" level=error msg="Error reading packet from client 1192 (127.0.0.1:51216): read tcp 127.0.0.1:3307->127.0.0.1:51216: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:07:41-08:00" level=info msg=ConnectionClosed connectionID=1192 +time="2026-03-05T17:07:50-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1193 +time="2026-03-05T17:07:50-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:51258: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1193" +time="2026-03-05T17:07:50-08:00" level=info msg=ConnectionClosed connectionID=1193 +time="2026-03-05T17:07:50-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1194 +time="2026-03-05T17:07:50-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1195 +time="2026-03-05T17:07:50-08:00" level=info msg=ConnectionClosed connectionID=1194 +time="2026-03-05T17:07:50-08:00" level=error msg="Error reading packet from client 1195 (127.0.0.1:51260): read tcp 127.0.0.1:3307->127.0.0.1:51260: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:07:50-08:00" level=info msg=ConnectionClosed connectionID=1195 +time="2026-03-05T17:07:51-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1196 +time="2026-03-05T17:07:51-08:00" level=error msg="Cannot send HandshakeV10 packet: write tcp 127.0.0.1:3307->127.0.0.1:51261: wsasend: An established connection was aborted by the software in your host machine.\nWrite(packet) failed\nconn 1196" +time="2026-03-05T17:07:51-08:00" level=info msg=ConnectionClosed connectionID=1196 +time="2026-03-05T17:07:51-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1197 +time="2026-03-05T17:07:51-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1198 +time="2026-03-05T17:07:51-08:00" level=info msg=ConnectionClosed connectionID=1197 +time="2026-03-05T17:07:51-08:00" level=error msg="Error reading packet from client 1198 (127.0.0.1:51263): read tcp 127.0.0.1:3307->127.0.0.1:51263: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:07:51-08:00" level=info msg=ConnectionClosed connectionID=1198 +time="2026-03-05T17:08:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1199 +time="2026-03-05T17:08:04-08:00" level=info msg=ConnectionClosed connectionID=1199 +time="2026-03-05T17:08:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1200 +time="2026-03-05T17:08:04-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1201 +time="2026-03-05T17:08:04-08:00" level=info msg=ConnectionClosed connectionID=1200 +time="2026-03-05T17:08:04-08:00" level=error msg="Error reading packet from client 1201 (127.0.0.1:52108): read tcp 127.0.0.1:3307->127.0.0.1:52108: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed" +time="2026-03-05T17:08:04-08:00" level=info msg=ConnectionClosed connectionID=1201 diff --git a/.gitignore b/.gitignore index b422cfa..07b8f93 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,31 @@ artifacts/ # Archived stashes for reference docs/references/stashes/ + +# Build artifacts +eslint-report.json +tsconfig.tsbuildinfo +out/ + +# Temporary files +tmp/ +test-*.mjs +test-*.ts +*.tmp +*.temp + +# Root image files (screenshots belong in docs/) +/image-*.png +/image.png + +# Runtime artifacts +.beads/ +.agents/ +.agent/ +.augment/ +.claude/ +.cline/ +.openhands/ +.qodo/ +.gemini/ +.kilocode/ diff --git a/README.md b/README.md index 0c832e4..7eaeb69 100644 --- a/README.md +++ b/README.md @@ -202,7 +202,7 @@ BeadBoard is an execution system for coordinating agents around shared Beads wor - **Global project scope switching** across single and aggregate workspaces - **Swarm orchestration** with archetypes/templates and assignment controls -![BeadBoard Dashboard - Multi-agent coordination interface showing task graph, agent pool, and activity stream](image-9.png) +![BeadBoard Dashboard - Multi-agent coordination interface showing task graph, agent pool, and activity stream](docs/screenshots/image-9.png) --- @@ -231,7 +231,7 @@ Agent Pool Monitor with: - Pre-assigned queue for reserved tasks - Squad roster for active team members -![Swarm Coordination Panel - Agent pool monitor showing archetypes, assignment queues, and squad roster](image-7.png) +![Swarm Coordination Panel - Agent pool monitor showing archetypes, assignment queues, and squad roster](docs/screenshots/image-7.png) ### 3. Graph + Dependency Topology @@ -241,7 +241,7 @@ DAG-oriented workspace for execution decisions: - Blocker/unblock context surfaced in task cards - Graph analysis support (cycle detection, blocked-chain identification) -![Dependency Graph View - DAG visualization showing task dependencies and execution order](image-8.png) +![Dependency Graph View - DAG visualization showing task dependencies and execution order](docs/screenshots/image-8.png) ### 4. Global Project Scope + Scanner diff --git a/image-1.png b/docs/screenshots/image-1.png similarity index 100% rename from image-1.png rename to docs/screenshots/image-1.png diff --git a/image-2.png b/docs/screenshots/image-2.png similarity index 100% rename from image-2.png rename to docs/screenshots/image-2.png diff --git a/image-3.png b/docs/screenshots/image-3.png similarity index 100% rename from image-3.png rename to docs/screenshots/image-3.png diff --git a/image-4.png b/docs/screenshots/image-4.png similarity index 100% rename from image-4.png rename to docs/screenshots/image-4.png diff --git a/image-5.png b/docs/screenshots/image-5.png similarity index 100% rename from image-5.png rename to docs/screenshots/image-5.png diff --git a/image-6.png b/docs/screenshots/image-6.png similarity index 100% rename from image-6.png rename to docs/screenshots/image-6.png diff --git a/image-7.png b/docs/screenshots/image-7.png similarity index 100% rename from image-7.png rename to docs/screenshots/image-7.png diff --git a/image-8.png b/docs/screenshots/image-8.png similarity index 100% rename from image-8.png rename to docs/screenshots/image-8.png diff --git a/image-9.png b/docs/screenshots/image-9.png similarity index 100% rename from image-9.png rename to docs/screenshots/image-9.png diff --git a/image.png b/docs/screenshots/image.png similarity index 100% rename from image.png rename to docs/screenshots/image.png diff --git a/eslint-report.json b/eslint-report.json deleted file mode 100644 index 0f7056e..0000000 --- a/eslint-report.json +++ /dev/null @@ -1 +0,0 @@ -[{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\avatar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\badge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\button.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\dropdown-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\label.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\scroll-area.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\select.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\separator.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\tabs.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\textarea.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\components\\ui\\tooltip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\eslint.config.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\lib\\utils.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\next.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\postcss.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\remotion.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\scripts\\bb-init.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\scripts\\capture-graph.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\scripts\\capture-kanban.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\scripts\\capture-sessions.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\scripts\\capture-timeline.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\activity\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\agent\\create\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\agents\\[agentId]\\stats\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\agents\\list\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\[id]\\comments\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\_shared.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\close\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\comment\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\create\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\read\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\reopen\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\beads\\update\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\events\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\mission\\[id]\\topology\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\mission\\assign\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\mission\\graph\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\mission\\list\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\projects\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\scan\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\sessions\\[beadId]\\comment\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\sessions\\[beadId]\\conversation\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\sessions\\[beadId]\\messages\\[messageId]\\ack\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\sessions\\[beadId]\\messages\\[messageId]\\read\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\sessions\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\archetypes\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\close\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\create\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\formulas\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\graph\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\join\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\launch\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\leave\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\list\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\prep\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\status\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\api\\swarm\\templates\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\graph\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\mockup\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\page-old.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\sessions\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\app\\timeline\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\activity\\activity-panel.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'e' is defined but never used.","line":281,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":281,"endColumn":17}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useEffect, useState, useMemo } from 'react';\nimport type { BeadIssue } from '../../lib/types';\nimport type { ActivityEvent } from '../../lib/activity';\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { cn } from '@/lib/utils';\n\ntype AgentStatus = 'active' | 'stale' | 'stuck' | 'dead';\n\ntype AgentTone = {\n cardClass: string;\n labelClass: string;\n ringClass: string;\n glowClass: string;\n};\n\ntype EventTone = {\n label: string;\n labelClass: string;\n dotClass: string;\n cardClass: string;\n idClass: string;\n};\n\ninterface AgentRosterEntry {\n name: string;\n status: AgentStatus;\n lastSeen: string | null;\n beadId: string;\n}\n\ninterface ActivityPanelProps {\n issues: BeadIssue[];\n collapsed?: boolean;\n}\n\nconst AGENT_LABEL = 'gt:agent';\n\n// Determine agent status based on last activity\nfunction deriveAgentStatus(lastSeenAt: string | null): AgentStatus {\n if (!lastSeenAt) return 'dead';\n \n const lastSeen = new Date(lastSeenAt);\n const now = new Date();\n const minutesSince = (now.getTime() - lastSeen.getTime()) / (1000 * 60);\n \n if (minutesSince < 15) return 'active';\n if (minutesSince < 30) return 'stale';\n if (minutesSince < 60) return 'stuck';\n return 'dead';\n}\n\n// Get agent name from bead\nfunction extractAgentName(issue: BeadIssue): string | null {\n const agentMatch = issue.title.match(/Agent:\\s*(\\S+)/i);\n if (agentMatch) return agentMatch[1];\n \n const agentLabel = issue.labels.find(l => l.startsWith('agent:'));\n if (agentLabel) return agentLabel.replace('agent:', '');\n \n return null;\n}\n\n// Build agent roster - filter out dead agents unless none are active\nfunction buildAgentRoster(issues: BeadIssue[]): AgentRosterEntry[] {\n const agentIssues = issues.filter(issue => \n issue.labels.includes(AGENT_LABEL) || \n issue.labels.some(l => l.startsWith('gt:agent')) ||\n issue.labels.includes('agent')\n );\n \n const roster = agentIssues.map(issue => {\n const name = extractAgentName(issue) || issue.title.replace('Agent: ', '') || issue.id;\n const status = deriveAgentStatus(issue.updated_at);\n \n return {\n name,\n status,\n lastSeen: issue.updated_at,\n beadId: issue.id,\n };\n }).sort((a, b) => {\n const statusOrder: Record = { active: 0, stale: 1, stuck: 2, dead: 3 };\n return statusOrder[a.status] - statusOrder[b.status];\n });\n\n // Show all non-dead agents, or at least the most recent ones\n return roster.filter(a => a.status !== 'dead' || a.lastSeen).slice(0, 10);\n}\n\n// Format relative time\nfunction formatRelativeTime(timestamp: string): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / (1000 * 60));\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n \n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n \n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n\nfunction getAgentTone(status: AgentStatus): AgentTone {\n const tones: Record = {\n active: {\n cardClass: 'bg-[#173126]',\n labelClass: 'text-[#7CB97A]',\n ringClass: 'ring-[#7CB97A]/45',\n glowClass: 'bg-[#7CB97A]/30',\n },\n stale: {\n cardClass: 'bg-[#322817]',\n labelClass: 'text-[#D4A574]',\n ringClass: 'ring-[#D4A574]/45',\n glowClass: 'bg-[#D4A574]/30',\n },\n stuck: {\n cardClass: 'bg-[#341a1f]',\n labelClass: 'text-[#C97A7A]',\n ringClass: 'ring-[#C97A7A]/45',\n glowClass: 'bg-[#C97A7A]/30',\n },\n dead: {\n cardClass: 'bg-[#2b232b]',\n labelClass: 'text-[#A78A94]',\n ringClass: 'ring-[#A78A94]/40',\n glowClass: 'bg-[#A78A94]/25',\n },\n };\n\n return tones[status];\n}\n\n// reopened=blue, closed=amber, created/opened=green, others semantic\nfunction getEventTone(kind: string): EventTone {\n const normalized = kind.toLowerCase();\n const byKind: Record = {\n created: {\n label: 'Created',\n labelClass: 'text-[#7CB97A]',\n dotClass: 'bg-[#7CB97A]',\n cardClass: 'bg-[#182f25]',\n idClass: 'text-[#9ACB98]',\n },\n opened: {\n label: 'Opened',\n labelClass: 'text-[#7CB97A]',\n dotClass: 'bg-[#7CB97A]',\n cardClass: 'bg-[#182f25]',\n idClass: 'text-[#9ACB98]',\n },\n closed: {\n label: 'Closed',\n labelClass: 'text-[#D4A574]',\n dotClass: 'bg-[#D4A574]',\n cardClass: 'bg-[#332716]',\n idClass: 'text-[#DAB891]',\n },\n reopened: {\n label: 'Reopened',\n labelClass: 'text-[#5B95E8]',\n dotClass: 'bg-[#5B95E8]',\n cardClass: 'bg-[#1b2b43]',\n idClass: 'text-[#8DB4EF]',\n },\n status_changed: {\n label: 'Status changed',\n labelClass: 'text-[#D4A574]',\n dotClass: 'bg-[#D4A574]',\n cardClass: 'bg-[#2f2518]',\n idClass: 'text-[#DAB891]',\n },\n priority_changed: {\n label: 'Priority changed',\n labelClass: 'text-[#D4A574]',\n dotClass: 'bg-[#D4A574]',\n cardClass: 'bg-[#2f2518]',\n idClass: 'text-[#DAB891]',\n },\n assignee_changed: {\n label: 'Assigned',\n labelClass: 'text-[#D4A574]',\n dotClass: 'bg-[#D4A574]',\n cardClass: 'bg-[#2f2518]',\n idClass: 'text-[#DAB891]',\n },\n dependency_added: {\n label: 'Dependency added',\n labelClass: 'text-[#D4A574]',\n dotClass: 'bg-[#D4A574]',\n cardClass: 'bg-[#2f2518]',\n idClass: 'text-[#DAB891]',\n },\n dependency_removed: {\n label: 'Dependency removed',\n labelClass: 'text-[#C97A7A]',\n dotClass: 'bg-[#C97A7A]',\n cardClass: 'bg-[#321b21]',\n idClass: 'text-[#D9A9A9]',\n },\n heartbeat: {\n label: 'Heartbeat',\n labelClass: 'text-[#5BA8A0]',\n dotClass: 'bg-[#5BA8A0]',\n cardClass: 'bg-[#173034]',\n idClass: 'text-[#8BC9C1]',\n },\n commented: {\n label: 'Commented',\n labelClass: 'text-[#5BA8A0]',\n dotClass: 'bg-[#5BA8A0]',\n cardClass: 'bg-[#173034]',\n idClass: 'text-[#8BC9C1]',\n },\n comment_added: {\n label: 'Commented',\n labelClass: 'text-[#5BA8A0]',\n dotClass: 'bg-[#5BA8A0]',\n cardClass: 'bg-[#173034]',\n idClass: 'text-[#8BC9C1]',\n },\n };\n\n return (\n byKind[normalized] || {\n label: normalized.replace(/_/g, ' '),\n labelClass: 'text-[#5BA8A0]',\n dotClass: 'bg-[#5BA8A0]',\n cardClass: 'bg-[#173034]',\n idClass: 'text-[#8BC9C1]',\n }\n );\n}\n\nfunction getInitials(name: string): string {\n return name.split(/[-_\\s]/).map(p => p[0]).join('').toUpperCase().slice(0, 2);\n}\n\nexport function ActivityPanel({ issues, collapsed = false }: ActivityPanelProps) {\n const [activities, setActivities] = useState([]);\n const [isLoading, setIsLoading] = useState(true);\n \n const agentRoster = useMemo(() => buildAgentRoster(issues), [issues]);\n \n // Fetch activity history\n useEffect(() => {\n async function fetchActivity() {\n try {\n const response = await fetch('/api/activity');\n if (response.ok) {\n const data = await response.json();\n setActivities(data.slice(0, 50)); // Limit to 50 events\n }\n } catch (error) {\n console.error('[ActivityPanel] Failed to fetch activity:', error);\n } finally {\n setIsLoading(false);\n }\n }\n \n fetchActivity();\n }, []);\n \n // Subscribe to real-time activity\n useEffect(() => {\n const source = new EventSource('/api/events');\n \n const onActivity = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n if (data?.event) {\n setActivities(prev => [data.event, ...prev].slice(0, 50));\n }\n } catch (e) {\n // Ignore parse errors\n }\n };\n \n source.addEventListener('activity', onActivity as EventListener);\n \n return () => {\n source.removeEventListener('activity', onActivity as EventListener);\n source.close();\n };\n }, []);\n\n const activeAgents = agentRoster.filter(a => a.status === 'active').length;\n if (collapsed) {\n return (\n
\n {/* Collapsed Agent Icons with ZFC Rings */}\n
\n {agentRoster.slice(0, 6).map(agent => (\n
\n
\n \n \n {getInitials(agent.name)}\n \n \n
\n ))}\n
\n \n
\n \n {/* Activity Pulses */}\n
\n {activities.slice(0, 8).map((act) => (\n
\n ))}\n
\n
\n );\n }\n\n return (\n
\n {/* AGENT ROSTER SECTION */}\n
\n
\n
\n
\n

Live Agents

\n
\n
\n {activeAgents} ONLINE\n
\n
\n \n {agentRoster.length === 0 ? (\n

No agents broadcasting

\n ) : (\n
\n {agentRoster.map(agent => (\n
\n
\n
\n \n \n {getInitials(agent.name)}\n \n \n
\n
\n {agent.name}\n
\n \n {agent.status}\n \n \n {agent.lastSeen ? formatRelativeTime(agent.lastSeen) : 'N/A'}\n \n
\n
\n
\n ))}\n
\n )}\n
\n \n {/* ACTIVITY FEED SECTION */}\n
\n
\n \n

Telemetry Stream

\n
\n \n \n {isLoading ? (\n
\n
\n SYNCING...\n
\n ) : activities.length === 0 ? (\n
\n

VOID_STREAM_NULL

\n
\n ) : (\n
\n {activities.map((activity) => {\n const eventTone = getEventTone(activity.kind);\n return (\n
\n
\n
\n
\n \n {eventTone.label}\n \n \n {formatRelativeTime(activity.timestamp)}\n \n
\n \n

\n {activity.beadTitle}\n

\n \n
\n \n {activity.beadId}\n \n {activity.actor && (\n
\n
\n {activity.actor[0].toUpperCase()}\n
\n {activity.actor}\n
\n )}\n
\n
\n
\n );\n })}\n
\n )}\n \n
\n
\n );\n}\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\dependency-flow-strip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\dependency-graph-page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\graph-node-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\graph-section.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\graph-view.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\task-card-grid.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\task-details-drawer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\graph\\workflow-tabs.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\kanban\\kanban-board.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\kanban\\kanban-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\kanban\\kanban-controls.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\kanban\\kanban-detail.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\kanban\\kanban-page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\mission\\mission-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\mission\\mission-inspector.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\mission\\swarm-graph.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\mission\\team-manager-dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\agent-station-logic.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\agent-station.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\conversation-drawer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\session-feed-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\session-task-feed.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\sessions-header-logic.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\sessions-header.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\sessions\\sessions-page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\agent-avatar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\base-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\chip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\epic-chip-strip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\left-panel.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\mobile-nav.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\module-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\project-scope-controls.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\right-panel.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\stat-pill.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\status-badge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\status-utils.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\thread-drawer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\thread-view.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\top-bar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\unified-shell.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\workflow-graph.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\shared\\workspace-hero.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\social\\social-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\social\\social-detail.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\social\\social-page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\archetype-inspector.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\convoy-stepper.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\launch-dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\specialized-agent-dag.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-control-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-detail.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'SwarmCardData' is defined but never used.","line":4,"column":15,"nodeType":"Identifier","messageId":"unusedVar","endLine":4,"endColumn":28,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"SwarmCardData"},"fix":{"range":[74,88],"text":""},"desc":"Remove unused variable \"SwarmCardData\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'cn' is defined but never used.","line":6,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":6,"endColumn":12,"suggestions":[{"messageId":"removeUnusedImportDeclaration","data":{"varName":"cn"},"fix":{"range":[192,230],"text":""},"desc":"Remove unused import declaration."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'e' is defined but never used.","line":53,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":53,"endColumn":17}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { SwarmCardData, SwarmStatusFromApi } from '../../lib/swarm-api';\nimport { Badge } from '../../../components/ui/badge';\nimport { cn } from '../../lib/utils';\nimport { CheckCircle2, PlayCircle, Clock, AlertCircle, Loader2 } from 'lucide-react';\n\ninterface SwarmDetailProps {\n swarmId: string;\n projectRoot: string;\n}\n\nfunction ProgressBar({ progress }: { progress: number }) {\n const filled = Math.round(progress / 10);\n const empty = 10 - filled;\n\n return (\n
\n
\n Progress\n {progress}%\n
\n
\n
\n {'█'.repeat(filled)}\n {'░'.repeat(empty)}\n
\n
\n
\n );\n}\n\nexport function SwarmDetail({ swarmId, projectRoot }: SwarmDetailProps) {\n const [status, setStatus] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n async function fetchStatus() {\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(\n `/api/swarm/status?projectRoot=${encodeURIComponent(projectRoot)}&epic=${encodeURIComponent(swarmId)}`\n );\n const payload = await response.json();\n if (payload.ok && payload.data) {\n setStatus(payload.data);\n } else {\n setError(payload.error?.message || 'Failed to load swarm status');\n }\n } catch (e) {\n setError('Failed to fetch swarm status');\n } finally {\n setIsLoading(false);\n }\n }\n fetchStatus();\n }, [swarmId, projectRoot]);\n\n if (isLoading) {\n return (\n
\n \n Loading swarm...\n
\n );\n }\n\n if (error) {\n return (\n
\n {error}\n
\n );\n }\n\n if (!status) {\n return (\n
\n No swarm data found\n
\n );\n }\n\n return (\n
\n {/* Header */}\n
\n
\n \n {swarmId}\n \n \n swarm\n \n
\n

\n {status.epic_title}\n

\n
\n\n {/* Progress */}\n \n\n {/* Stats Grid */}\n
\n
\n \n {status.completed.length} done\n
\n
\n \n {status.active_count} active\n
\n
\n \n {status.ready_count} ready\n
\n
\n \n {status.blocked_count} blocked\n
\n
\n\n {/* Active Tasks */}\n {status.active.length > 0 && (\n
\n

\n Active ({status.active.length})\n

\n
\n {status.active.map((task) => (\n
\n {task.id}\n

{task.title}

\n
\n ))}\n
\n
\n )}\n\n {/* Ready Tasks */}\n {status.ready.length > 0 && (\n
\n

\n Ready to Pick Up ({status.ready.length})\n

\n
\n {status.ready.map((task) => (\n
\n {task.id}\n

{task.title}

\n
\n ))}\n
\n
\n )}\n\n {/* Blocked Tasks */}\n {status.blocked.length > 0 && (\n
\n

\n Blocked ({status.blocked.length})\n

\n
\n {status.blocked.map((task) => (\n
\n {task.id}\n

{task.title}

\n
\n ))}\n
\n
\n )}\n
\n );\n}\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-inspector.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'SwarmCardData' is defined but never used.","line":4,"column":15,"nodeType":"Identifier","messageId":"unusedVar","endLine":4,"endColumn":28,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"SwarmCardData"},"fix":{"range":[74,88],"text":""},"desc":"Remove unused variable \"SwarmCardData\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'Button' is defined but never used.","line":6,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":6,"endColumn":16,"suggestions":[{"messageId":"removeUnusedImportDeclaration","data":{"varName":"Button"},"fix":{"range":[185,234],"text":""},"desc":"Remove unused import declaration."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'agents' is assigned a value but never used.","line":39,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":39,"endColumn":17},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'e' is defined but never used.","line":55,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":55,"endColumn":17},{"ruleId":"react/no-unescaped-entities","severity":2,"message":"`\"` can be escaped with `"`, `“`, `"`, `”`.","line":116,"column":50,"nodeType":"JSXText","messageId":"unescapedEntityAlts","suggestions":[{"messageId":"replaceWithAlt","data":{"alt":"""},"fix":{"range":[4177,4205],"text":"Use "Join\" on the main card."},"desc":"Replace with `"`."},{"messageId":"replaceWithAlt","data":{"alt":"“"},"fix":{"range":[4177,4205],"text":"Use “Join\" on the main card."},"desc":"Replace with `“`."},{"messageId":"replaceWithAlt","data":{"alt":"""},"fix":{"range":[4177,4205],"text":"Use "Join\" on the main card."},"desc":"Replace with `"`."},{"messageId":"replaceWithAlt","data":{"alt":"”"},"fix":{"range":[4177,4205],"text":"Use ”Join\" on the main card."},"desc":"Replace with `”`."}]},{"ruleId":"react/no-unescaped-entities","severity":2,"message":"`\"` can be escaped with `"`, `“`, `"`, `”`.","line":116,"column":55,"nodeType":"JSXText","messageId":"unescapedEntityAlts","suggestions":[{"messageId":"replaceWithAlt","data":{"alt":"""},"fix":{"range":[4177,4205],"text":"Use \"Join" on the main card."},"desc":"Replace with `"`."},{"messageId":"replaceWithAlt","data":{"alt":"“"},"fix":{"range":[4177,4205],"text":"Use \"Join“ on the main card."},"desc":"Replace with `“`."},{"messageId":"replaceWithAlt","data":{"alt":"""},"fix":{"range":[4177,4205],"text":"Use \"Join" on the main card."},"desc":"Replace with `"`."},{"messageId":"replaceWithAlt","data":{"alt":"”"},"fix":{"range":[4177,4205],"text":"Use \"Join” on the main card."},"desc":"Replace with `”`."}]}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { SwarmCardData, SwarmStatusFromApi } from '../../lib/swarm-api';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { CheckCircle2, PlayCircle, Clock, AlertCircle, Loader2, Users } from 'lucide-react';\nimport { AgentAvatar } from '../shared/agent-avatar';\nimport { useAgentPool } from '../../hooks/use-agent-pool';\n\ninterface SwarmInspectorProps {\n swarmId: string;\n projectRoot: string;\n onClose?: () => void;\n}\n\nfunction ProgressBar({ progress }: { progress: number }) {\n const filled = Math.round(progress / 10);\n const empty = 10 - filled;\n\n return (\n
\n
\n Progress\n {progress}%\n
\n
\n {'█'.repeat(filled)}\n {'░'.repeat(empty)}\n
\n
\n );\n}\n\nexport function SwarmInspector({ swarmId, projectRoot }: SwarmInspectorProps) {\n const [status, setStatus] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const { agents, getAgentsBySwarm } = useAgentPool(projectRoot);\n\n useEffect(() => {\n async function fetchStatus() {\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(\n `/api/swarm/status?projectRoot=${encodeURIComponent(projectRoot)}&epic=${encodeURIComponent(swarmId)}`\n );\n const payload = await response.json();\n if (payload.ok && payload.data) {\n setStatus(payload.data);\n } else {\n setError(payload.error?.message || 'Failed to load swarm status');\n }\n } catch (e) {\n setError('Failed to fetch swarm status');\n } finally {\n setIsLoading(false);\n }\n }\n fetchStatus();\n }, [swarmId, projectRoot]);\n\n const assignedAgents = getAgentsBySwarm(swarmId);\n\n if (isLoading) {\n return (\n
\n \n Loading...\n
\n );\n }\n\n if (error || !status) {\n return (\n
\n {error || 'No data found'}\n
\n );\n }\n\n return (\n
\n {/* Header */}\n
\n
\n \n {swarmId}\n \n Active Operation\n
\n

\n {status.epic_title}\n

\n \n
\n\n
\n {/* Agent Roster */}\n
\n
\n

\n \n Assigned Agents\n

\n \n {assignedAgents.length}\n \n
\n \n {assignedAgents.length === 0 ? (\n
\n No agents currently assigned.\n
\n Use \"Join\" on the main card.\n
\n ) : (\n
\n {assignedAgents.map(agent => (\n
\n \n
\n

{agent.display_name}

\n

{agent.status}

\n
\n
\n ))}\n
\n )}\n
\n\n {/* Task Stats */}\n
\n
\n
\n \n Done\n
\n {status.completed.length}\n
\n
\n
\n \n Active\n
\n {status.active_count}\n
\n
\n
\n \n Ready\n
\n {status.ready_count}\n
\n
\n
\n \n Blocked\n
\n {status.blocked_count}\n
\n
\n\n {/* Active Tasks List */}\n {status.active.length > 0 && (\n
\n

\n Currently Executing\n

\n
\n {status.active.map((task) => (\n
\n
\n {task.id}\n IN PROGRESS\n
\n

{task.title}

\n
\n ))}\n
\n
\n )}\n
\n
\n );\n}\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-mission-picker.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-page.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'LayoutGrid' is defined but never used.","line":18,"column":53,"nodeType":"Identifier","messageId":"unusedVar","endLine":18,"endColumn":63,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"LayoutGrid"},"fix":{"range":[688,700],"text":""},"desc":"Remove unused variable \"LayoutGrid\"."}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useMemo, useState, useCallback, useEffect, useRef } from 'react';\nimport { useMissionList, type MissionData } from '../../hooks/use-mission-list';\nimport { MissionCard } from '../mission/mission-card';\nimport { TeamManagerDialog } from '../mission/team-manager-dialog';\nimport { MissionInspector } from '../mission/mission-inspector';\nimport { LaunchSwarmDialog } from './launch-dialog';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport { Button } from '@/components/ui/button';\nimport { ArrowUpDown, ChevronDown, Loader2, Rocket, LayoutGrid, Users, Shield } from 'lucide-react';\nimport { useAgentPool } from '../../hooks/use-agent-pool';\n\ntype SortOption = 'health' | 'activity' | 'progress' | 'name';\n\nconst SORT_LABELS: Record = {\n health: 'Health',\n activity: 'Activity',\n progress: 'Progress',\n name: 'Name',\n};\n\nconst INITIAL_LIMIT = 16;\n\nfunction sortMissions(missions: MissionData[], sortBy: SortOption): MissionData[] {\n const sorted = [...missions];\n switch (sortBy) {\n case 'progress':\n return sorted.sort((a, b) => (b.stats.done / (b.stats.total || 1)) - (a.stats.done / (a.stats.total || 1)));\n case 'activity':\n return sorted; // Need last_activity in API to sort real activity\n case 'health':\n return sorted.sort((a, b) => b.stats.blocked - a.stats.blocked); // Most blocked first\n case 'name':\n return sorted.sort((a, b) => a.title.localeCompare(b.title));\n default:\n return sorted;\n }\n}\n\ninterface SwarmPageProps {\n projectRoot: string;\n selectedId?: string;\n onSelect: (id: string) => void;\n setRightPanel?: (content: React.ReactNode | null) => void;\n}\n\nexport function SwarmPage({ projectRoot, selectedId, onSelect, setRightPanel }: SwarmPageProps) {\n const [sortBy, setSortBy] = useState('health');\n const [expanded, setExpanded] = useState(false);\n const [manageTeamId, setManageTeamId] = useState(null);\n\n // Refs to break dependency loops\n const onSelectRef = useRef(onSelect);\n useEffect(() => { onSelectRef.current = onSelect; }, [onSelect]);\n\n const { missions, isLoading, error, refresh: refreshMissions } = useMissionList(projectRoot);\n const { agents, refresh: refreshAgents } = useAgentPool(projectRoot);\n \n const sortedMissions = useMemo(() => sortMissions(missions, sortBy), [missions, sortBy]);\n const visibleMissions = expanded ? sortedMissions : sortedMissions.slice(0, INITIAL_LIMIT);\n const hasMore = sortedMissions.length > INITIAL_LIMIT;\n\n const busyAgents = agents.filter(a => a.status === 'working').length;\n\n // Handle Team Manager Actions\n const handleAssign = useCallback(async (agentId: string, action: 'join' | 'leave') => {\n // If called from inspector, we use selectedId. If called from dialog, we use manageTeamId.\n const targetMissionId = manageTeamId || selectedId;\n if (!targetMissionId) return;\n\n const endpoint = action === 'join' ? '/api/mission/assign' : '/api/mission/assign';\n \n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ \n projectRoot, \n missionId: targetMissionId,\n agentId,\n action\n }),\n });\n \n await Promise.all([refreshMissions(), refreshAgents()]);\n }, [manageTeamId, selectedId, projectRoot, refreshMissions, refreshAgents]);\n\n const activeMissionForInspector = missions.find(m => m.id === selectedId);\n const activeMission = missions.find(m => m.id === manageTeamId);\n\n // Sync right panel on selectedId change\n useEffect(() => {\n if (selectedId && setRightPanel && activeMissionForInspector) {\n setRightPanel(\n onSelectRef.current('')} \n onAssign={(agentId, action) => handleAssign(agentId, action)}\n />\n );\n } else if (!selectedId && setRightPanel) {\n setRightPanel(null);\n }\n }, [selectedId, projectRoot, setRightPanel, activeMissionForInspector, handleAssign]); // Removed onSelect from deps\n\n return (\n
\n {/* Dashboard Stats */}\n
\n
\n
\n \n
\n
\n

Active Missions

\n

{missions.length}

\n
\n
\n
\n
\n \n
\n
\n

Agent Fleet

\n

{agents.length}

\n
\n
\n
\n
\n

Operational Load

\n
\n {busyAgents}/{agents.length}\n engaged\n
\n
\n
\n
\n\n {/* Toolbar */}\n
\n
\n
\n

Command

\n

\n Mission Control\n

\n
\n
\n \n
\n\n \n \n \n \n {SORT_LABELS[sortBy]}\n \n \n \n Sort Missions\n \n {(Object.keys(SORT_LABELS) as SortOption[]).map((option) => (\n setSortBy(option)}\n className={sortBy === option ? 'bg-indigo-500/10 text-indigo-400' : 'focus:bg-white/5 focus:text-white'}\n >\n {SORT_LABELS[option]}\n \n ))}\n \n \n
\n\n {/* Grid */}\n
\n {visibleMissions.map((mission) => (\n onSelect(mission.id)}\n onDeploy={() => setManageTeamId(mission.id)}\n />\n ))}\n
\n\n {hasMore && (\n
\n setExpanded(true)}\n className=\"gap-2 border-white/10 bg-white/5 text-[var(--ui-text-primary)] hover:bg-white/10\"\n >\n Show All Missions\n \n \n
\n )}\n\n {isLoading && (\n
\n \n

Establishing Uplink...

\n
\n )}\n\n {!isLoading && !error && missions.length === 0 && (\n
\n \n

No active missions. Launch one to begin.

\n \n
\n )}\n\n {/* Dialogs */}\n {activeMission && (\n setManageTeamId(null)}\n missionId={activeMission.id}\n missionTitle={activeMission.title}\n projectRoot={projectRoot}\n assignedAgents={activeMission.agents}\n onAssign={handleAssign}\n />\n )}\n
\n );\n}","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\swarm-workspace.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\telemetry-grid.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\swarm\\template-inspector.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'Edit' is defined but never used.","line":2,"column":19,"nodeType":"Identifier","messageId":"unusedVar","endLine":2,"endColumn":23,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"Edit"},"fix":{"range":[44,50],"text":""},"desc":"Remove unused variable \"Edit\"."}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import React from 'react';\r\nimport { X, Save, Edit, Link, Network } from 'lucide-react';\r\nimport type { SwarmTemplate, AgentArchetype } from '../../lib/types-swarm';\r\n\r\ninterface TemplateInspectorProps {\r\n template: SwarmTemplate;\r\n archetypes: AgentArchetype[];\r\n onClose: () => void;\r\n}\r\n\r\nexport function TemplateInspector({ template, archetypes, onClose }: TemplateInspectorProps) {\r\n if (!template) return null;\r\n\r\n const totalAgents = template.team.reduce((acc, curr) => acc + curr.count, 0);\r\n\r\n return (\r\n
\r\n
\r\n\r\n {/* Header */}\r\n
\r\n
\r\n
\r\n {totalAgents}\r\n
\r\n
\r\n
\r\n

{template.name}

\r\n {template.isBuiltIn && (\r\n Built-in\r\n )}\r\n
\r\n

{template.id}

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n {/* Body Content */}\r\n
\r\n\r\n {/* Metadata Section */}\r\n
\r\n \r\n \r\n
\r\n\r\n {/* Team Composition Builder */}\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n {template.team.map((member, idx) => {\r\n const arch = archetypes.find(a => a.id === member.archetypeId);\r\n return (\r\n
\r\n
\r\n {arch?.name.charAt(0) || '?'}\r\n
\r\n
\r\n
{arch?.name || member.archetypeId}
\r\n
{arch?.description || 'Unknown Archetype'}
\r\n
\r\n
\r\n Count:\r\n \r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n\r\n {/* Advanced: Proto-formula */}\r\n
\r\n \r\n
\r\n \r\n
\r\n Specifies a Gastown Formula to execute (`bd mol pour`) when launching this swarm.\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n {/* Footer Controls */}\r\n
\r\n \r\n Close\r\n \r\n \r\n \r\n Save Template\r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\timeline\\event-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\timeline\\timeline-feed.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\components\\timeline\\timeline-store.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-agent-pool.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-archetypes.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-beads-subscription.ts","messages":[],"suppressedMessages":[{"ruleId":"react-hooks/exhaustive-deps","severity":1,"message":"React Hook useEffect has a missing dependency: 'onUpdate'. Either include it or remove the dependency array.","line":110,"column":6,"nodeType":"ArrayExpression","endLine":110,"endColumn":28,"suggestions":[{"desc":"Update the dependencies array to be: [onUpdate, projectRoot, refresh]","fix":{"range":[3876,3898],"text":"[onUpdate, projectRoot, refresh]"}}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-mission-graph.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'e' is defined but never used.","line":32,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":32,"endColumn":17}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { BeadIssue } from '../lib/types';\n\ninterface UseMissionGraphResult {\n nodes: BeadIssue[];\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useMissionGraph(projectRoot: string, missionId: string): UseMissionGraphResult {\n const [nodes, setNodes] = useState([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n async function fetchGraph() {\n if (!missionId) return;\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(\n `/api/mission/graph?projectRoot=${encodeURIComponent(projectRoot)}&id=${encodeURIComponent(missionId)}`\n );\n const payload = await response.json();\n if (payload.ok && payload.data) {\n setNodes(payload.data.nodes);\n } else {\n setError(payload.error || 'Failed to load graph');\n }\n } catch (e) {\n setError('Failed to fetch mission graph');\n } finally {\n setIsLoading(false);\n }\n }\n fetchGraph();\n }, [projectRoot, missionId]);\n\n return { nodes, isLoading, error };\n}\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-mission-list.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-responsive.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-session-feed.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-swarm-list.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-swarm-topology.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'err' is defined but never used.","line":35,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":35,"endColumn":19}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use client';\n\nimport { useState, useEffect } from 'react';\n\nexport interface SwarmTopologyData {\n completed: { id: string; title: string; assignee?: string }[];\n active: { id: string; title: string; assignee?: string }[];\n ready: { id: string; title: string }[];\n blocked: { id: string; title: string; blocked_by: string[] }[];\n progress_percent: number;\n}\n\nexport function useSwarmTopology(projectRoot: string, swarmId: string) {\n const [topology, setTopology] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n\n async function fetchTopology() {\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(`/api/mission/${swarmId}/topology?projectRoot=${encodeURIComponent(projectRoot)}`);\n const result = await response.json();\n \n if (mounted) {\n if (result.ok) {\n setTopology(result.data);\n } else {\n setError(result.error);\n }\n }\n } catch (err) {\n if (mounted) setError('Failed to load topology');\n } finally {\n if (mounted) setIsLoading(false);\n }\n }\n\n if (projectRoot && swarmId) {\n fetchTopology();\n }\n\n return () => { mounted = false; };\n }, [projectRoot, swarmId]);\n\n return { topology, isLoading, error };\n}\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-templates.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\hooks\\use-url-state.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\activity-persistence.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\activity.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\agent-mail.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\agent-protocol.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\agent-registry.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\agent-reservations.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\agent-sessions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\aggregate-read.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\bd-path.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\bridge.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\coalescer.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\graph-view.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\graph.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\issue-editor.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\kanban.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\mutations.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\parser.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\pathing.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\project-context.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\project-scope.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\read-interactions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\read-issues.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\read-text-retry.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\realtime.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\registry.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\scanner.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\server\\beads-fs.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\snapshot-differ.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\social-cards.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\swarm-api.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\swarm-cards.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\swarm-molecules.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\thread-builder.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\types-swarm.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\types.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\utils.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\watcher.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\lib\\writeback.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\Main.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\Root.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\components\\Background.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'durationInFrames' is assigned a value but never used.","line":13,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":13,"endColumn":27}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { interpolate, useCurrentFrame, useVideoConfig, AbsoluteFill } from 'remotion';\nimport React, { useMemo } from 'react';\n\nconst COLORS = {\n bgBase: '#2D2D2D',\n accentGreen: '#7CB97A',\n accentAmber: '#D4A574',\n accentTeal: '#5BA8A0',\n};\n\nconst AnimatedGradient: React.FC = () => {\n const frame = useCurrentFrame();\n const { durationInFrames } = useVideoConfig();\n\n // Create smooth looping motion for the blobs\n const offset1 = Math.sin(frame / 60) * 10;\n const offset2 = Math.cos(frame / 50) * 10;\n const scale1 = interpolate(Math.sin(frame / 80), [-1, 1], [0.8, 1.2]);\n const scale2 = interpolate(Math.cos(frame / 70), [-1, 1], [0.8, 1.2]);\n\n return (\n \n \n \n \n \n );\n};\n\nconst DotGrid: React.FC = () => {\n const frame = useCurrentFrame();\n const { width, height } = useVideoConfig();\n\n // Generate a static grid of dots\n // Only calculate once\n const dots = useMemo(() => {\n const d = [];\n const spacing = 80;\n const cols = Math.ceil(width / spacing);\n const rows = Math.ceil(height / spacing);\n\n for (let i = 0; i < cols; i++) {\n for (let j = 0; j < rows; j++) {\n d.push({ x: i * spacing, y: j * spacing, delay: (i + j) * 2 });\n }\n }\n return d;\n }, [width, height]);\n\n return (\n \n \n {dots.map((dot, i) => {\n // Subtle fade in/out ripple effect based on position\n const wave = Math.sin((frame - dot.delay) / 20);\n const opacity = interpolate(wave, [-1, 1], [0.03, 0.15]);\n const scale = interpolate(wave, [-1, 1], [0.5, 1.2]);\n \n return (\n \n );\n })}\n \n \n );\n};\n\nexport const Background: React.FC = () => {\n return (\n \n \n \n \n );\n};\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\components\\TerminalScene.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'spring' is defined but never used.","line":1,"column":80,"nodeType":"Identifier","messageId":"unusedVar","endLine":1,"endColumn":86,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"spring"},"fix":{"range":[77,85],"text":""},"desc":"Remove unused variable \"spring\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'useMemo' is defined but never used.","line":2,"column":17,"nodeType":"Identifier","messageId":"unusedVar","endLine":2,"endColumn":24,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"useMemo"},"fix":{"range":[117,130],"text":""},"desc":"Remove unused variable \"useMemo\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'fps' is assigned a value but never used.","line":45,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":45,"endColumn":14}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { interpolate, useCurrentFrame, useVideoConfig, AbsoluteFill, Sequence, spring } from 'remotion';\nimport React, { useMemo } from 'react';\n\nconst TerminalLine: React.FC<{ text: string; delay: number; color?: string }> = ({ text, delay, color = '#d1d5db' }) => {\n const frame = useCurrentFrame();\n const chars = text.split('');\n \n return (\n
\n {chars.map((char, i) => {\n const show = frame > delay + i * 1.5;\n return (\n \n {char}\n \n );\n })}\n
\n );\n};\n\nconst JSONLine: React.FC<{ data: object; delay: number }> = ({ data, delay }) => {\n const frame = useCurrentFrame();\n const str = JSON.stringify(data, null, 2);\n const lines = str.split('\\n');\n\n const show = frame > delay;\n const opacity = interpolate(frame, [delay, delay + 10], [0, 1]);\n const y = interpolate(frame, [delay, delay + 10], [10, 0]);\n\n if (!show) return null;\n\n return (\n
\n {lines.map((line, i) => (\n
{line}
\n ))}\n
\n );\n}\n\n\nexport const TerminalScene: React.FC = () => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n\n const opacity = interpolate(frame, [0, 15], [0, 1]);\n const scale = interpolate(frame, [0, 15], [0.95, 1]);\n \n // Header animation\n const headerY = interpolate(frame, [0, 20], [20, 0]);\n const headerOpacity = interpolate(frame, [0, 20], [0, 1]);\n\n return (\n \n \n {/* Header */}\n
\n

Protocol v1

\n

Safe Coordination Contract

\n
\n\n
\n {/* Terminal Header */}\n
\n
\n
\n
\n
beadboard-agent — -zsh — 80x24
\n
\n\n {/* Terminal Body */}\n
\n \n bb agent heartbeat --agent amber-otter --json\" delay={0} color=\"#a5f3fc\" />\n \n \n \n \n \n\n \n bb protocol emit HANDOFF --to cobalt-harbor\" delay={0} color=\"#a5f3fc\" />\n \n\n \n
\n \n \n To: cobalt-harbor\" delay={20} />\n \n
\n
\n\n \n
\n \n \n \n
\n
\n\n {/* Scanlines / CRT Effect Overlay */}\n
\n
\n
\n \n );\n};\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\components\\TimelineScene.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'fps' is assigned a value but never used.","line":60,"column":13,"nodeType":"Identifier","messageId":"unusedVar","endLine":60,"endColumn":16}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { interpolate, useCurrentFrame, useVideoConfig, AbsoluteFill, Sequence, spring } from 'remotion';\nimport React from 'react';\n\nconst COLORS = {\n bgBase: '#2D2D2D',\n cardBg: '#363636',\n accentGreen: '#7CB97A',\n accentAmber: '#D4A574',\n accentTeal: '#5BA8A0',\n textPrimary: '#FFFFFF',\n textSecondary: '#B8B8B8',\n border: 'rgba(255, 255, 255, 0.08)',\n};\n\nconst TimelineCard: React.FC<{ \n title: string; \n subtitle: string; \n time: string; \n type: 'commit' | 'issue' | 'alert'; \n index: number; \n}> = ({ title, subtitle, time, type, index }) => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n\n const delay = index * 5;\n const spr = spring({\n frame: frame - delay,\n fps,\n config: { damping: 14, mass: 0.8 },\n });\n\n const y = interpolate(spr, [0, 1], [50, 0]);\n const opacity = interpolate(spr, [0, 1], [0, 1]);\n\n let iconColor = COLORS.textSecondary;\n if (type === 'commit') iconColor = COLORS.accentTeal;\n if (type === 'issue') iconColor = COLORS.accentGreen;\n if (type === 'alert') iconColor = COLORS.accentAmber;\n\n return (\n
\n
\n
\n
\n

{title}

\n {time}\n
\n

{subtitle}

\n
\n
\n );\n};\n\nexport const TimelineScene: React.FC = () => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n\n const titleOpacity = interpolate(frame, [0, 20], [0, 1]);\n const titleY = interpolate(frame, [0, 20], [20, 0]);\n\n return (\n \n
\n

Live Activity Feed

\n

Real-time Project Pulse

\n
\n\n
\n
Today
\n \n \n \n \n \n \n \n \n \n \n \n
Yesterday
\n
\n\n \n \n \n \n \n \n
\n
\n );\n};\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\src\\video\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tailwind.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\api\\events-route.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\api\\mutations-routes.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\api\\projects-route.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\api\\sessions-route.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\api\\swarm\\archetypes.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\bootstrap.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\sessions\\agent-station-logic.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\sessions\\session-feed-card-state.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\sessions\\sessions-header-logic.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\sessions\\sessions-header.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\sessions\\sessions-store.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\agent-avatar.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\base-card.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\left-panel.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\mobile-nav.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\right-panel.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\status-utils-visual.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\shared\\top-bar.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\social\\social-card.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\swarm\\swarm-card.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\swarm\\swarm-mission-picker.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\swarm\\swarm-workspace.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\components\\unified-shell.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\guards\\graph-responsive-contract.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\guards\\kanban-responsive-contract.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\guards\\no-direct-jsonl-write.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\guards\\no-inline-style-in-kanban.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\guards\\ui-foundation-contract.test.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\hooks\\url-state-integration.test.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'ViewType' is defined but never used.","line":3,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":3,"endColumn":54,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"ViewType"},"fix":{"range":[116,131],"text":""},"desc":"Remove unused variable \"ViewType\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'GraphTabType' is defined but never used.","line":3,"column":61,"nodeType":"Identifier","messageId":"unusedVar","endLine":3,"endColumn":73,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"GraphTabType"},"fix":{"range":[131,150],"text":""},"desc":"Remove unused variable \"GraphTabType\"."}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\r\nimport assert from 'node:assert';\r\nimport { parseUrlState, buildUrlParams, type ViewType, type GraphTabType } from '../../src/hooks/use-url-state';\r\n\r\n/**\r\n * URL State Integration Tests - bb-ui2.22\r\n * \r\n * These tests verify that all URL patterns correctly restore view state\r\n * and that the URL state system handles edge cases properly.\r\n */\r\n\r\nfunction createMockSearchParams(params: Record = {}) {\r\n const sp = new URLSearchParams();\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value !== null && value !== undefined) {\r\n sp.set(key, value);\r\n }\r\n }\r\n return sp;\r\n}\r\n\r\ndescribe('URL State Integration - bb-ui2.22', () => {\r\n describe('Valid URL Patterns - Social View', () => {\r\n it('/?view=social - defaults to social view', () => {\r\n const sp = createMockSearchParams({ view: 'social' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'social');\r\n assert.strictEqual(state.taskId, null);\r\n assert.strictEqual(state.swarmId, null);\r\n assert.strictEqual(state.panel, 'open');\r\n });\r\n\r\n it('/?view=social&task=bb-buff.1&panel=open - task selected, panel open', () => {\r\n const sp = createMockSearchParams({ view: 'social', task: 'bb-buff.1', panel: 'open' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'social');\r\n assert.strictEqual(state.taskId, 'bb-buff.1');\r\n assert.strictEqual(state.panel, 'open');\r\n });\r\n\r\n it('/?view=social&task=bb-ui2.22 - task with dots in ID', () => {\r\n const sp = createMockSearchParams({ view: 'social', task: 'bb-ui2.22' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.taskId, 'bb-ui2.22');\r\n });\r\n });\r\n\r\n describe('Valid URL Patterns - Graph View', () => {\r\n it('/?view=graph - graph view default', () => {\r\n const sp = createMockSearchParams({ view: 'graph' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'graph');\r\n assert.strictEqual(state.graphTab, 'flow');\r\n });\r\n\r\n it('/?view=graph&task=bb-buff.1 - graph with task selected', () => {\r\n const sp = createMockSearchParams({ view: 'graph', task: 'bb-buff.1' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'graph');\r\n assert.strictEqual(state.taskId, 'bb-buff.1');\r\n });\r\n\r\n it('/?view=graph&graphTab=flow - flow tab selected', () => {\r\n const sp = createMockSearchParams({ view: 'graph', graphTab: 'flow' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.graphTab, 'flow');\r\n });\r\n\r\n it('/?view=graph&graphTab=overview - overview tab selected', () => {\r\n const sp = createMockSearchParams({ view: 'graph', graphTab: 'overview' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.graphTab, 'overview');\r\n });\r\n\r\n it('/?view=graph&swarm=bb-buff - graph filtered by swarm', () => {\r\n const sp = createMockSearchParams({ view: 'graph', swarm: 'bb-buff' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'graph');\r\n assert.strictEqual(state.swarmId, 'bb-buff');\r\n });\r\n });\r\n\r\n describe('Valid URL Patterns - Swarm View', () => {\r\n it('/?view=swarm - swarm view default', () => {\r\n const sp = createMockSearchParams({ view: 'swarm' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'swarm');\r\n });\r\n\r\n it('/?view=swarm&swarm=bb-buff - specific swarm selected', () => {\r\n const sp = createMockSearchParams({ view: 'swarm', swarm: 'bb-buff' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'swarm');\r\n assert.strictEqual(state.swarmId, 'bb-buff');\r\n });\r\n\r\n it('/?view=swarm&swarm=bb-buff&panel=open - swarm with panel open', () => {\r\n const sp = createMockSearchParams({ view: 'swarm', swarm: 'bb-buff', panel: 'open' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.swarmId, 'bb-buff');\r\n assert.strictEqual(state.panel, 'open');\r\n });\r\n });\r\n\r\n describe('Valid URL Patterns - Activity View', () => {\r\n it('/?view=activity - activity view default', () => {\r\n const sp = createMockSearchParams({ view: 'activity' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'activity');\r\n });\r\n\r\n it('/?view=activity&agent=bb-silver-castle - filtered by agent', () => {\r\n const sp = createMockSearchParams({ view: 'activity', agent: 'bb-silver-castle' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'activity');\r\n assert.strictEqual(state.agentId, 'bb-silver-castle');\r\n });\r\n\r\n it('/?view=activity&swarm=bb-buff - filtered by swarm', () => {\r\n const sp = createMockSearchParams({ view: 'activity', swarm: 'bb-buff' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'activity');\r\n assert.strictEqual(state.swarmId, 'bb-buff');\r\n });\r\n });\r\n\r\n describe('Invalid Param Handling', () => {\r\n it('/?view=invalid - invalid view defaults to social', () => {\r\n const sp = createMockSearchParams({ view: 'invalid' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'social');\r\n });\r\n\r\n it('/?view=graph&graphTab=invalid - invalid graphTab defaults to flow', () => {\r\n const sp = createMockSearchParams({ view: 'graph', graphTab: 'invalid' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.graphTab, 'flow');\r\n });\r\n\r\n it('/?panel=invalid - invalid panel defaults to open', () => {\r\n const sp = createMockSearchParams({ panel: 'invalid' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.panel, 'open');\r\n });\r\n\r\n it('/?task=invalid-id - invalid task ID still parsed (no validation)', () => {\r\n const sp = createMockSearchParams({ task: 'invalid-id' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.taskId, 'invalid-id');\r\n });\r\n });\r\n\r\n describe('URL Building - State to URL', () => {\r\n it('builds social view URL', () => {\r\n const sp = createMockSearchParams({});\r\n const url = buildUrlParams(sp, { view: 'social' });\r\n assert.strictEqual(url, '/?view=social');\r\n });\r\n\r\n it('builds graph view with task URL', () => {\r\n const sp = createMockSearchParams({});\r\n const url = buildUrlParams(sp, { view: 'graph', task: 'bb-buff.1' });\r\n assert.strictEqual(url, '/?view=graph&task=bb-buff.1');\r\n });\r\n\r\n it('builds swarm view with swarm param', () => {\r\n const sp = createMockSearchParams({});\r\n const url = buildUrlParams(sp, { view: 'swarm', swarm: 'bb-buff' });\r\n assert.strictEqual(url, '/?view=swarm&swarm=bb-buff');\r\n });\r\n\r\n it('builds activity view with agent filter', () => {\r\n const sp = createMockSearchParams({});\r\n const url = buildUrlParams(sp, { view: 'activity', agent: 'bb-silver-castle' });\r\n assert.strictEqual(url, '/?view=activity&agent=bb-silver-castle');\r\n });\r\n\r\n it('preserves existing params when adding new ones', () => {\r\n const sp = createMockSearchParams({ view: 'social' });\r\n const url = buildUrlParams(sp, { task: 'bb-buff.1' });\r\n assert.strictEqual(url, '/?view=social&task=bb-buff.1');\r\n });\r\n\r\n it('removes params when set to null', () => {\r\n const sp = createMockSearchParams({ view: 'social', task: 'bb-buff.1', panel: 'open' });\r\n const url = buildUrlParams(sp, { task: null, panel: 'closed' });\r\n assert.strictEqual(url, '/?view=social&panel=closed');\r\n });\r\n\r\n it('returns root when all params cleared', () => {\r\n const sp = createMockSearchParams({ view: 'social' });\r\n const url = buildUrlParams(sp, { view: null });\r\n assert.strictEqual(url, '/');\r\n });\r\n });\r\n\r\n describe('Complex URL Scenarios', () => {\r\n it('handles all params together', () => {\r\n const sp = createMockSearchParams({\r\n view: 'graph',\r\n task: 'bb-ui2.22',\r\n swarm: 'bb-ui2',\r\n panel: 'open',\r\n graphTab: 'overview',\r\n agent: 'bb-silver-castle'\r\n });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.view, 'graph');\r\n assert.strictEqual(state.taskId, 'bb-ui2.22');\r\n assert.strictEqual(state.swarmId, 'bb-ui2');\r\n assert.strictEqual(state.panel, 'open');\r\n assert.strictEqual(state.graphTab, 'overview');\r\n assert.strictEqual(state.agentId, 'bb-silver-castle');\r\n });\r\n\r\n it('empty string values treated as null/empty', () => {\r\n const sp = createMockSearchParams({ task: '', swarm: '' });\r\n const state = parseUrlState(sp);\r\n assert.strictEqual(state.taskId, '');\r\n assert.strictEqual(state.swarmId, '');\r\n });\r\n });\r\n\r\n describe('Deep Link Patterns - From Card Icons', () => {\r\n it('SocialCard Graph icon: /?view=graph&task={id}', () => {\r\n const sp = createMockSearchParams({});\r\n const url = buildUrlParams(sp, { view: 'graph', task: 'bb-ui2.33' });\r\n assert.strictEqual(url, '/?view=graph&task=bb-ui2.33');\r\n \r\n const parsed = parseUrlState(createMockSearchParams({ view: 'graph', task: 'bb-ui2.33' }));\r\n assert.strictEqual(parsed.view, 'graph');\r\n assert.strictEqual(parsed.taskId, 'bb-ui2.33');\r\n });\r\n\r\n it('SwarmCard Graph icon: /?view=graph&swarm={id}', () => {\r\n const url = buildUrlParams(createMockSearchParams({}), { view: 'graph', swarm: 'bb-buff' });\r\n assert.strictEqual(url, '/?view=graph&swarm=bb-buff');\r\n });\r\n\r\n it('SwarmCard Timeline icon: /?view=activity&swarm={id}', () => {\r\n const url = buildUrlParams(createMockSearchParams({}), { view: 'activity', swarm: 'bb-buff' });\r\n assert.strictEqual(url, '/?view=activity&swarm=bb-buff');\r\n });\r\n\r\n it('Agent avatar click: /?view=activity&agent={id}', () => {\r\n const url = buildUrlParams(createMockSearchParams({}), { view: 'activity', agent: 'bb-silver-castle' });\r\n assert.strictEqual(url, '/?view=activity&agent=bb-silver-castle');\r\n });\r\n });\r\n});\r\n","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\hooks\\use-beads-subscription-shallow.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\hooks\\use-beads-subscription.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\hooks\\use-responsive.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\hooks\\use-url-state.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\activity.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-liveness.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-mail.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-protocol.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-registry-bd.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-registry.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-reservations.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-sessions-liveness.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-sessions-state.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-sessions.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\agent-takeover.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\aggregate-read.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\bd-path.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\bridge.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\coalescer.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\graph-view.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\graph.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\identity-isolation.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\issue-editor.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\kanban.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\mission-pathing.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\mutations.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\parser.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\path-overlap.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\pathing.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\project-context.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\project-scope.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\read-issues.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\read-text-retry.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\realtime-history.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\realtime.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\registry.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\scanner.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\snapshot-differ-stress.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\snapshot-differ.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\social-cards.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\swarm-cards.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\swarm-molecules-simple.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\swarm-molecules.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\watcher.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\lib\\writeback.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\scripts\\bb-init.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\server\\beads-fs.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\skills\\beadboard-driver\\generate-agent-name.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\skills\\beadboard-driver\\readiness-report.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\skills\\beadboard-driver\\resolve-bb.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\skills\\beadboard-driver\\session-preflight.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\skills\\beadboard-driver\\skill-local-runner.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tests\\types\\beads-types-contract.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tools\\bb.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\Zenchant\\codex\\beadboard\\tools\\guardrails\\no-direct-jsonl-write.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}] diff --git a/out/thumbnail.png b/out/thumbnail.png deleted file mode 100644 index c0f9fe9..0000000 Binary files a/out/thumbnail.png and /dev/null differ diff --git a/out/video.mp4 b/out/video.mp4 deleted file mode 100644 index 4e88f9b..0000000 Binary files a/out/video.mp4 and /dev/null differ diff --git a/test-sse.mjs b/test-sse.mjs deleted file mode 100644 index c9f516a..0000000 --- a/test-sse.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import EventSource from 'eventsource'; - -const projectRoot = 'C:\\Users\\Zenchant\\codex\\beadboard'; -const url = `http://localhost:3001/api/events?projectRoot=${encodeURIComponent(projectRoot)}`; - -console.log(`Connecting to ${url}...`); -const es = new EventSource(url); - -es.on('open', () => console.log('OPEN')); -es.on('error', (e) => { - console.error('ERROR'); - console.error(e); -}); - -['message', 'issues', 'telemetry', 'activity'].forEach(event => { - es.addEventListener(event, (e) => { - console.log(`[${event.toUpperCase()}]`, e.data); - }); -}); - -setTimeout(() => { - console.log('Closing after 30s'); - es.close(); -}, 60000); diff --git a/test-watcher.ts b/test-watcher.ts deleted file mode 100644 index 2ec0441..0000000 --- a/test-watcher.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { readIssuesFromDisk } from './src/lib/read-issues'; -import { runBdCommand } from './src/lib/bridge'; - -const projectRoot = 'C:\\Users\\Zenchant\\codex\\beadboard'; - -async function run() { - console.log('1. Reading current state...'); - const state1 = await readIssuesFromDisk({ projectRoot, preferBd: true, skipAgentFilter: true }); - console.log(`State 1 has ${state1.length} issues.`); - - console.log('2. Creating a test issue via bd...'); - await runBdCommand({ projectRoot, args: ['create', 'Diff test issue', '-p', '0'] }); - - console.log('3. Reading new state...'); - const state2 = await readIssuesFromDisk({ projectRoot, preferBd: true, skipAgentFilter: true }); - console.log(`State 2 has ${state2.length} issues.`); - - if (state1.length === state2.length) { - console.error('ERROR: State length did not change! readIssuesFromDisk is caching or returning stale data.'); - } else { - console.log('SUCCESS: State length changed. The issue is in watcher.ts snapshot management.'); - } -} - -run().catch(console.error);