f90614a622
UwfAcpClient now tracks all session/update events: - agent_message_chunk → assistant message content - agent_thought_chunk → assistant reasoning - tool_call → pending tool invocation (name + rawInput) - tool_call_update (completed/failed) → assistant tool_call + tool result Messages are accumulated across prompts (same session) and stored via storeHermesSessionDetail, restoring the full structured detail (turns with tool calls, reasoning) that was lost in the initial ACP migration. Ref #398
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
|
|
|
|
import { HermesAcpClient } from "../src/acp-client.js";
|
|
|
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
|
|
describe("HermesAcpClient", () => {
|
|
let client: HermesAcpClient;
|
|
|
|
beforeEach(() => {
|
|
client = new HermesAcpClient();
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await client.close();
|
|
});
|
|
|
|
it(
|
|
"connect() returns a UUID sessionId",
|
|
async () => {
|
|
const sessionId = await client.connect(process.cwd());
|
|
expect(typeof sessionId).toBe("string");
|
|
expect(sessionId).toMatch(UUID_RE);
|
|
},
|
|
{ timeout: 2 * 60 * 1000 },
|
|
);
|
|
|
|
it(
|
|
"prompt() returns a non-empty text response",
|
|
async () => {
|
|
await client.connect(process.cwd());
|
|
const result = await client.prompt("Reply with exactly the word: PONG");
|
|
expect(typeof result.text).toBe("string");
|
|
expect(result.text.length).toBeGreaterThan(0);
|
|
expect(typeof result.sessionId).toBe("string");
|
|
expect(result.sessionId).toMatch(UUID_RE);
|
|
},
|
|
{ timeout: 2 * 60 * 1000 },
|
|
);
|
|
|
|
it(
|
|
"prompt() can be called twice on the same session (resume)",
|
|
async () => {
|
|
await client.connect(process.cwd());
|
|
|
|
const first = await client.prompt("Say the word ALPHA and nothing else.");
|
|
expect(first.text.length).toBeGreaterThan(0);
|
|
|
|
const second = await client.prompt("Now say the word BETA and nothing else.");
|
|
expect(second.text.length).toBeGreaterThan(0);
|
|
|
|
expect(first.sessionId).toBe(second.sessionId);
|
|
},
|
|
{ timeout: 2 * 60 * 1000 },
|
|
);
|
|
|
|
it(
|
|
"prompt() collects structured messages including tool calls",
|
|
async () => {
|
|
await client.connect(process.cwd());
|
|
const result = await client.prompt("Run this command: echo TOOL_DETAIL_TEST");
|
|
expect(result.messages.length).toBeGreaterThan(0);
|
|
// Should have at least one tool message (the echo command)
|
|
const toolMessages = result.messages.filter((m) => m.role === "tool");
|
|
expect(toolMessages.length).toBeGreaterThan(0);
|
|
// Tool message should contain the output
|
|
const toolContent = toolMessages[0]?.content ?? "";
|
|
expect(toolContent).toContain("TOOL_DETAIL_TEST");
|
|
// Should have assistant messages with tool_calls
|
|
const assistantWithTools = result.messages.filter(
|
|
(m) => m.role === "assistant" && m.tool_calls !== null,
|
|
);
|
|
expect(assistantWithTools.length).toBeGreaterThan(0);
|
|
},
|
|
{ timeout: 2 * 60 * 1000 },
|
|
);
|
|
});
|