fix: 完善 serve 模式 session 列表接口
- GET /session/:id 支持从磁盘历史记录 fallback,修复历史 session 404 - 过滤无意义的管理命令会话(/exit、/model、/login 等) - 保留 /crewpilot:plan 等有意义的斜杠命令触发的会话 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
a62989e245
commit
231c76df84
|
|
@ -215,10 +215,26 @@ export function createSessionRoutes(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按最后活跃时间倒序
|
// 过滤掉已知的无意义管理命令会话(用户直接输入后立即退出,没有实际对话内容)
|
||||||
merged.sort((a, b) => (b.last_active_at ?? 0) - (a.last_active_at ?? 0))
|
const BORING_COMMANDS = new Set([
|
||||||
|
'/exit', '/quit', '/bye',
|
||||||
|
'/clear', '/reset',
|
||||||
|
'/model', '/models',
|
||||||
|
'/login', '/logout',
|
||||||
|
'/help', '/version',
|
||||||
|
'/compact',
|
||||||
|
])
|
||||||
|
const filtered = merged.filter(s => {
|
||||||
|
const t = s.title.trim()
|
||||||
|
if (!t) return false
|
||||||
|
if (BORING_COMMANDS.has(t)) return false
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
const sessions = merged.slice(offset, offset + limit)
|
// 按最后活跃时间倒序
|
||||||
|
filtered.sort((a, b) => (b.last_active_at ?? 0) - (a.last_active_at ?? 0))
|
||||||
|
|
||||||
|
const sessions = filtered.slice(offset, offset + limit)
|
||||||
process.stderr.write(`[server:session] GET /session -> history=${historySessions.length} active=${handleMap.size} merged=${merged.length} returned=${sessions.length}\n`)
|
process.stderr.write(`[server:session] GET /session -> history=${historySessions.length} active=${handleMap.size} merged=${merged.length} returned=${sessions.length}\n`)
|
||||||
return c.json({ sessions })
|
return c.json({ sessions })
|
||||||
})
|
})
|
||||||
|
|
@ -256,16 +272,42 @@ export function createSessionRoutes(
|
||||||
|
|
||||||
return c.json({ sessions })
|
return c.json({ sessions })
|
||||||
})
|
})
|
||||||
.get('/session/:sessionID', c => {
|
.get('/session/:sessionID', async c => {
|
||||||
const id = c.req.param('sessionID')
|
const id = c.req.param('sessionID')
|
||||||
const handle = sessionManager.getSession(id)
|
const handle = sessionManager.getSession(id)
|
||||||
if (!handle) throw notFound('session not found')
|
if (handle) {
|
||||||
const info = handle.getInfo()
|
const info = handle.getInfo()
|
||||||
return c.json({
|
return c.json({
|
||||||
...info,
|
...info,
|
||||||
message_count: handle.messageCount,
|
message_count: handle.messageCount,
|
||||||
usage: handle.usage,
|
usage: handle.usage,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 内存中没有,从磁盘历史记录查找
|
||||||
|
try {
|
||||||
|
const history = await listSessionsImpl({ limit: 1000 })
|
||||||
|
const s = history.find(h => h.sessionId === id)
|
||||||
|
if (s) {
|
||||||
|
return c.json({
|
||||||
|
session_id: s.sessionId,
|
||||||
|
status: 'stopped',
|
||||||
|
cwd: s.cwd ?? '',
|
||||||
|
title: (s.customTitle ?? s.firstPrompt ?? s.summary) ?? '',
|
||||||
|
model: undefined,
|
||||||
|
permission_mode: undefined,
|
||||||
|
created_at: s.createdAt ?? 0,
|
||||||
|
last_active_at: s.lastModified ?? 0,
|
||||||
|
cost_usd: 0,
|
||||||
|
input_tokens: 0,
|
||||||
|
output_tokens: 0,
|
||||||
|
message_count: 0,
|
||||||
|
usage: { input_tokens: 0, output_tokens: 0 },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
throw notFound('session not found')
|
||||||
})
|
})
|
||||||
.patch('/session/:sessionID', async c => {
|
.patch('/session/:sessionID', async c => {
|
||||||
const id = c.req.param('sessionID')
|
const id = c.req.param('sessionID')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user