mirror of
https://github.com/browseros-ai/BrowserOS.git
synced 2026-05-21 21:05:09 +00:00
* feat: add acp agent runtime spike * feat: add agent harness catalog * feat: persist harness agents in json * feat: persist agent transcripts * feat: route harness service through agent records * feat: expose generic agent harness routes * feat: add harness agent frontend api * feat: create harness agents from agents page * feat: chat with persisted harness agents * chore: remove obsolete agent profile spike * chore: self-review fixes * fix: combine openclaw and harness agents UI * refactor: split agents page components * fix: hide persisted harness turns
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import {
|
|
type AgentEntry,
|
|
getModelDisplayName,
|
|
type OpenClawStatus,
|
|
} from '@/entrypoints/app/agents/useOpenClaw'
|
|
import type { AgentCardData } from '@/lib/agent-conversations/types'
|
|
import type { AgentOverview } from './useAgentDashboard'
|
|
|
|
function resolveAgentStatus(
|
|
gatewayStatus: OpenClawStatus['status'] | undefined,
|
|
liveStatus: AgentOverview['status'] | undefined,
|
|
): AgentCardData['status'] {
|
|
// Gateway-level errors take precedence
|
|
if (gatewayStatus === 'error') return 'error'
|
|
if (gatewayStatus === 'starting') return 'working'
|
|
|
|
// Per-agent live status from the WS observer
|
|
if (liveStatus === 'working') return 'working'
|
|
if (liveStatus === 'error') return 'error'
|
|
|
|
return 'idle'
|
|
}
|
|
|
|
/**
|
|
* Build agent card display data by merging the raw agent entries from
|
|
* the gateway with enriched overview data from the dashboard API.
|
|
*
|
|
* Pure function — no hooks, no IndexedDB, no async.
|
|
*/
|
|
export function buildAgentCardData(
|
|
agents: AgentEntry[],
|
|
status: OpenClawStatus['status'] | undefined,
|
|
dashboard: AgentOverview[] | undefined,
|
|
): AgentCardData[] {
|
|
return agents.map((agent) => {
|
|
const overview = dashboard?.find((d) => d.agentId === agent.agentId)
|
|
|
|
return {
|
|
agentId: agent.agentId,
|
|
name: agent.name,
|
|
model: getModelDisplayName(agent.model),
|
|
status:
|
|
agent.source === 'agent-harness'
|
|
? 'idle'
|
|
: resolveAgentStatus(status, overview?.status),
|
|
lastMessage: overview?.latestMessage?.slice(0, 200) ?? undefined,
|
|
lastMessageTimestamp: overview?.latestMessageAt ?? undefined,
|
|
activitySummary: overview?.activitySummary ?? undefined,
|
|
currentTool: overview?.currentTool ?? undefined,
|
|
costUsd: overview?.totalCostUsd ?? undefined,
|
|
}
|
|
})
|
|
}
|