(session: Session)
| 54 | } |
| 55 | |
| 56 | export function toSessionSummary(session: Session): SessionSummary { |
| 57 | const pendingRequestsCount = session.agentState?.requests ? Object.keys(session.agentState.requests).length : 0 |
| 58 | |
| 59 | const metadata: SessionSummaryMetadata | null = session.metadata ? { |
| 60 | name: session.metadata.name, |
| 61 | path: session.metadata.path, |
| 62 | machineId: session.metadata.machineId ?? undefined, |
| 63 | summary: session.metadata.summary ? { text: session.metadata.summary.text } : undefined, |
| 64 | flavor: session.metadata.flavor ?? null, |
| 65 | worktree: session.metadata.worktree, |
| 66 | agentSessionId: session.metadata.codexSessionId |
| 67 | ?? session.metadata.claudeSessionId |
| 68 | ?? session.metadata.geminiSessionId |
| 69 | ?? session.metadata.opencodeSessionId |
| 70 | ?? session.metadata.cursorSessionId |
| 71 | ?? session.metadata.kimiSessionId |
| 72 | ?? undefined, |
| 73 | lifecycleState: session.metadata.lifecycleState |
| 74 | } : null |
| 75 | |
| 76 | const todoProgress = session.todos?.length ? { |
| 77 | completed: session.todos.filter(t => t.status === 'completed').length, |
| 78 | total: session.todos.length |
| 79 | } : null |
| 80 | |
| 81 | return { |
| 82 | id: session.id, |
| 83 | active: session.active, |
| 84 | thinking: session.thinking, |
| 85 | activeAt: session.activeAt, |
| 86 | updatedAt: session.updatedAt, |
| 87 | metadata, |
| 88 | todoProgress, |
| 89 | pendingRequestsCount, |
| 90 | pendingRequestKinds: getPendingRequestKinds(session), |
| 91 | backgroundTaskCount: session.backgroundTaskCount ?? 0, |
| 92 | futureScheduledMessageCount: 0, |
| 93 | model: session.model, |
| 94 | effort: session.effort |
| 95 | } |
| 96 | } |
no test coverage detected