- Add :key to PromptBar to force remount on agent switch, fixing shared terminal session bug - Raise AgentTerminal z-index above PromptBar backdrop so floating terminal is visible/clickable - Send prompt text char-by-char (15ms delay) matching FloatingVoice pattern for Claude Code compat - Guard xterm dispose against unloaded addons to prevent errors on agent switch - Widen PromptBar panel from 360px to 420px to fit all ChatInput buttons
115 lines
3.5 KiB
TypeScript
115 lines
3.5 KiB
TypeScript
import { jsonResponse, errorResponse } from '../utils/cors'
|
|
import { getTranscriptAnalysis, listSessions, getActiveSession, resetSessionOffset, getClaudeStats, getClaudeUsage } from '../services/transcript-engine'
|
|
import type { TranscriptAnalysis } from '../services/transcript-engine'
|
|
|
|
export function handleClaudeUsage(): Response {
|
|
const usage = getClaudeUsage()
|
|
if (!usage) return errorResponse('Usage data not available', 404)
|
|
return jsonResponse(usage)
|
|
}
|
|
|
|
export function handleClaudeStats(): Response {
|
|
const stats = getClaudeStats()
|
|
if (!stats) return errorResponse('Stats not available', 404)
|
|
return jsonResponse(stats)
|
|
}
|
|
|
|
export function handleTranscriptSessions(): Response {
|
|
const sessions = listSessions()
|
|
return jsonResponse(sessions)
|
|
}
|
|
|
|
export function handleTranscriptActive(req: Request, url: URL): Response {
|
|
if (req.method !== 'GET') return errorResponse('Method not allowed', 405)
|
|
|
|
const agent = url.searchParams.get('agent') || 'main'
|
|
const activeSession = getActiveSession(agent)
|
|
|
|
const sessionId = activeSession?.sessionId
|
|
const analysis = getTranscriptAnalysis(sessionId, activeSession?.transcriptPath)
|
|
|
|
if (!analysis) return errorResponse('No active session found', 404)
|
|
|
|
// Reset offset so future incrementals start from here
|
|
resetSessionOffset(analysis.sessionId)
|
|
|
|
return jsonResponse({
|
|
...analysis,
|
|
messages: analysis.messages.filter(m => !m.isMeta)
|
|
})
|
|
}
|
|
|
|
export function handleTranscript(req: Request, url: URL, sessionId: string): Response {
|
|
if (req.method !== 'GET') return errorResponse('Method not allowed', 405)
|
|
|
|
const resolvedId = sessionId === 'latest' ? undefined : sessionId
|
|
const analysis = getTranscriptAnalysis(resolvedId)
|
|
|
|
if (!analysis) {
|
|
return errorResponse('Transcript not found', 404)
|
|
}
|
|
|
|
// Section filtering
|
|
const section = url.searchParams.get('section')
|
|
if (section) {
|
|
return handleSection(analysis, section)
|
|
}
|
|
|
|
// Full response (exclude thinking by default)
|
|
const includeThinking = url.searchParams.get('includeThinking') === 'true'
|
|
if (!includeThinking) {
|
|
return jsonResponse({
|
|
...analysis,
|
|
messages: analysis.messages.filter(m => !m.isMeta)
|
|
})
|
|
}
|
|
|
|
return jsonResponse({
|
|
...analysis,
|
|
messages: analysis.messages.filter(m => !m.isMeta)
|
|
})
|
|
}
|
|
|
|
function handleSection(analysis: TranscriptAnalysis, section: string): Response {
|
|
switch (section) {
|
|
case 'messages':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
messages: analysis.messages.filter(m => !m.isMeta)
|
|
})
|
|
case 'tokens':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
tokens: analysis.tokens
|
|
})
|
|
case 'tools':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
tools: analysis.tools
|
|
})
|
|
case 'stats':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
stats: analysis.stats,
|
|
model: analysis.model,
|
|
version: analysis.version,
|
|
duration: analysis.duration,
|
|
startTime: analysis.startTime,
|
|
endTime: analysis.endTime,
|
|
lastStopReason: analysis.lastStopReason
|
|
})
|
|
case 'files':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
filesModified: analysis.filesModified
|
|
})
|
|
case 'subagents':
|
|
return jsonResponse({
|
|
sessionId: analysis.sessionId,
|
|
subagents: analysis.subagents
|
|
})
|
|
default:
|
|
return errorResponse(`Unknown section: ${section}. Valid: messages, tokens, tools, stats, files, subagents`, 400)
|
|
}
|
|
}
|