fix: exclude conversation threads from agents
This commit is contained in:
@@ -172,7 +172,7 @@ export function normalizeRuntime(payload = {}) {
|
|||||||
.filter((edge) => edge.toThreadId)
|
.filter((edge) => edge.toThreadId)
|
||||||
.map((edge) => [edge.toThreadId, normalizeSpawnStatus(edge.reason || edge.status)]),
|
.map((edge) => [edge.toThreadId, normalizeSpawnStatus(edge.reason || edge.status)]),
|
||||||
)
|
)
|
||||||
const agents = threads.map((thread) => {
|
const agents = threads.filter(isRuntimeAgentThread).map((thread) => {
|
||||||
const source = normalizeSource(thread.source, payload.source)
|
const source = normalizeSource(thread.source, payload.source)
|
||||||
const threadGoals = goalsByThread.get(thread.id) ?? []
|
const threadGoals = goalsByThread.get(thread.id) ?? []
|
||||||
const status = thread.status || spawnStatusByThread.get(thread.id) || threadGoals.find((goal) => goal.status)?.status || 'unknown'
|
const status = thread.status || spawnStatusByThread.get(thread.id) || threadGoals.find((goal) => goal.status)?.status || 'unknown'
|
||||||
@@ -189,7 +189,7 @@ export function normalizeRuntime(payload = {}) {
|
|||||||
status,
|
status,
|
||||||
statusZh: formatStatus(status),
|
statusZh: formatStatus(status),
|
||||||
goal: goalText || '没有目标记录',
|
goal: goalText || '没有目标记录',
|
||||||
process: thread.title || thread.preview || 'SQLite 只读快照',
|
process: describeRuntimeProcess(thread),
|
||||||
source: source.label,
|
source: source.label,
|
||||||
confidence: source.confidenceLabel,
|
confidence: source.confidenceLabel,
|
||||||
lastActivity: thread.updatedAt || thread.createdAt || '没有时间记录',
|
lastActivity: thread.updatedAt || thread.createdAt || '没有时间记录',
|
||||||
@@ -209,6 +209,29 @@ export function normalizeRuntime(payload = {}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isRuntimeAgentThread(thread) {
|
||||||
|
return Boolean(
|
||||||
|
thread?.agentNickname ||
|
||||||
|
thread?.agentRole ||
|
||||||
|
thread?.agentPath ||
|
||||||
|
thread?.threadSource === 'subagent' ||
|
||||||
|
thread?.role,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function describeRuntimeProcess(thread) {
|
||||||
|
if (thread.threadSource === 'subagent') {
|
||||||
|
return '子智能体线程'
|
||||||
|
}
|
||||||
|
if (thread.agentPath) {
|
||||||
|
return `智能体配置:${basename(thread.agentPath)}`
|
||||||
|
}
|
||||||
|
if (thread.agentNickname || thread.agentRole || thread.role) {
|
||||||
|
return '智能体线程'
|
||||||
|
}
|
||||||
|
return 'SQLite 只读快照'
|
||||||
|
}
|
||||||
|
|
||||||
export function filterRuntimeByProject(runtime = normalizeRuntime(), projectPath = '') {
|
export function filterRuntimeByProject(runtime = normalizeRuntime(), projectPath = '') {
|
||||||
const targetPath = normalizePath(projectPath)
|
const targetPath = normalizePath(projectPath)
|
||||||
const agents = runtime.agents.filter((agent) => belongsToProject(agent, targetPath))
|
const agents = runtime.agents.filter((agent) => belongsToProject(agent, targetPath))
|
||||||
|
|||||||
@@ -178,6 +178,39 @@ test('filters runtime to selected project and displays agent names from Codex me
|
|||||||
assert.equal(projectRuntime.agents[0].statusZh, '运行中')
|
assert.equal(projectRuntime.agents[0].statusZh, '运行中')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('does not turn ordinary conversation threads into agents', () => {
|
||||||
|
const runtime = normalizeRuntime({
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
id: 'conversation',
|
||||||
|
cwd: '/Users/yoilun',
|
||||||
|
title: '为什么点 yoilun 这个项目出来的都是对话的信息',
|
||||||
|
preview: '普通用户对话,不是智能体',
|
||||||
|
threadSource: 'user',
|
||||||
|
source: { kind: 'sqlite_table', confidence: 'high' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'reviewer',
|
||||||
|
cwd: '/Users/yoilun',
|
||||||
|
title: '审查 /Users/yoilun 项目',
|
||||||
|
agentNickname: 'Lorentz',
|
||||||
|
agentRole: '代码审查员',
|
||||||
|
threadSource: 'subagent',
|
||||||
|
source: { kind: 'sqlite_table', confidence: 'high' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
source: { kind: 'sqlite_readonly', confidence: 'high' },
|
||||||
|
})
|
||||||
|
|
||||||
|
const projectRuntime = filterRuntimeByProject(runtime, '/Users/yoilun')
|
||||||
|
|
||||||
|
assert.equal(runtime.threads.length, 2)
|
||||||
|
assert.deepEqual(projectRuntime.agents.map((agent) => agent.id), ['reviewer'])
|
||||||
|
assert.equal(projectRuntime.agents[0].name, 'Lorentz')
|
||||||
|
assert.equal(projectRuntime.agents[0].process, '子智能体线程')
|
||||||
|
assert.doesNotMatch(projectRuntime.agents[0].process, /审查 \/Users\/yoilun/)
|
||||||
|
})
|
||||||
|
|
||||||
test('keeps project threads when Codex cwd is an ancestor but metadata names the project path', () => {
|
test('keeps project threads when Codex cwd is an ancestor but metadata names the project path', () => {
|
||||||
const runtime = normalizeRuntime({
|
const runtime = normalizeRuntime({
|
||||||
items: [
|
items: [
|
||||||
|
|||||||
Reference in New Issue
Block a user