Files
workflow/packages/workflow-agent-hermes/README.md
T
xingyue 6324122168
CI / test (pull_request) Failing after 12m19s
fix(uwf-hermes): read turn data from Hermes session file instead of ACP stream
Closes #519

The ACP protocol's tool_call updates only carry a display title (not a
structured tool name) and omit rawInput for polished tools, making the
reconstructed messages unusable for step read/show.

Changes:
- hermes.ts: storePromptResult reads ~/.hermes/sessions/session_{id}.json
  via loadHermesSession() instead of using ACP-reconstructed messages
- acp-client.ts: strip message/tool-call collection logic, keep only
  text chunk accumulation for final response extraction
- step.ts: TurnData gains role + toolCalls fields; formatTurnBody
  renders them in step read markdown output
- README: document sessions.write_json_snapshots requirement
2026-05-25 22:21:03 +08:00

2.7 KiB

@uncaged/workflow-agent-hermes

uwf-hermes agent — spawns Hermes chat via ACP and captures session detail.

Overview

Layer 3 agent implementation. Wraps the Hermes CLI using the Agent Client Protocol (ACP). On first visit to a role it sends a composed prompt (role definition, task, history, edge prompt); on continuation it resumes the cached session. Session transcripts and raw output are stored as CAS detail nodes.

Dependencies: @uncaged/json-cas, @uncaged/workflow-util-agent, @uncaged/workflow-protocol, @uncaged/workflow-util

Installation

Included as the uwf-hermes binary when you install @uncaged/workflow-agent-hermes:

bun add -g @uncaged/workflow-agent-hermes

Requires the hermes CLI on PATH.

Hermes must write session JSON snapshots so uwf-hermes can load structured tool calls from disk. Add this to ~/.hermes/config.yaml:

sessions:
  write_json_snapshots: true

Session files are stored at ~/.hermes/sessions/session_{sessionId}.json.

CLI Usage

Invoked by uwf thread step (not typically run directly):

uwf-hermes <thread-id> <role>

Environment variables set by the engine:

Variable Purpose
UWF_EDGE_PROMPT Moderator edge instruction for this step

Configure as the default agent via uwf setup --agent hermes.

Override per step:

uwf thread step <thread-id> --agent uwf-hermes

API

All exports come from src/index.ts.

Agent factory

function createHermesAgent(): () => Promise<void>
function buildHermesPrompt(ctx: AgentContext): string

ACP client

class HermesAcpClient {
  // Spawns hermes, handles JSON-RPC over stdio
}

Usage (library)

import { createHermesAgent, buildHermesPrompt } from "@uncaged/workflow-agent-hermes";

// CLI entry (src/cli.ts):
const main = createHermesAgent();
void main();

Internal Structure

src/
├── index.ts
├── cli.ts              Binary entrypoint
├── hermes.ts           createHermesAgent, buildHermesPrompt
├── acp-client.ts       HermesAcpClient — ACP JSON-RPC over stdio
├── session-cache.ts    Session ID cache (re-exports kit helpers + isResumeDisabled)
├── session-detail.ts   Parse Hermes session JSON, store CAS detail nodes
├── schemas.ts          Hermes detail CAS schemas
└── types.ts            HermesSessionJson, HermesSessionMessage

Configuration

Uses workflow config from ~/.uncaged/workflow/config.yaml (via agent-kit). Hermes session files are stored under the workflow storage root (see session-detail.ts).

Set UWF_HERMES_NO_RESUME=1 to disable session resume (see isResumeDisabled in session-cache.ts).