feat(ui): session identification — project badges, relative time, running indicator

This commit is contained in:
2026-03-08 00:11:29 +09:00
parent 808eb66849
commit db70840b7a
3 changed files with 112 additions and 18 deletions

View File

@@ -92,19 +92,41 @@
async function loadBridgeSessions() {
try {
const res = await fetch('/api/bridge/sessions');
if (!res.ok) return;
const data = await res.json();
bridgeSessions = (data.sessions || []).map(s => ({
id: s.id,
name: s.title || s.id.substring(0, 8),
host: 'bridge',
cdpPort: 0,
status: 'connected',
title: s.title,
stepCount: s.stepCount,
isBridge: true,
}));
// 세션 목록 + cascades를 병렬로 가져오기
const [sessRes, cascRes] = await Promise.all([
fetch('/api/bridge/sessions'),
fetch('/api/bridge/cascades'),
]);
if (!sessRes.ok) return;
const sessData = await sessRes.json();
let cascadeMap = {};
if (cascRes.ok) {
const cascData = await cascRes.json();
cascadeMap = cascData.cascades || cascData;
}
bridgeSessions = (sessData.sessions || []).map(s => {
const cascade = cascadeMap[s.id] || {};
// 워크스페이스에서 프로젝트명 추출
const wsUri = cascade.workspaces?.[0]?.workspaceFolderAbsoluteUri || '';
const project = wsUri ? decodeURIComponent(wsUri.split('/').pop()) : '';
// 상태
const runStatus = cascade.status || '';
const isRunning = runStatus.includes('RUNNING');
return {
id: s.id,
name: s.title || s.id.substring(0, 8),
host: 'bridge',
cdpPort: 0,
status: isRunning ? 'running' : 'connected',
title: s.title,
stepCount: s.stepCount,
lastModified: s.lastModifiedTime,
project: project,
isRunning: isRunning,
isBridge: true,
};
});
sessionPanel.update(bridgeSessions);
// 활성 세션 없으면 가장 최근 대화 자동 선택
if (!sessionPanel.activeSessionId && bridgeSessions.length > 0) {