feat(orchestrator): add MS23 per-agent message history and SSE stream endpoints
Some checks failed
ci/woodpecker/push/ci Pipeline failed
Some checks failed
ci/woodpecker/push/ci Pipeline failed
GET /agents/:id/messages - paginated message history GET /agents/:id/messages/stream - SSE live stream with replay Partial #693
This commit is contained in:
@@ -4,6 +4,7 @@ import { AgentSpawnerService } from "../../spawner/agent-spawner.service";
|
||||
import { AgentLifecycleService } from "../../spawner/agent-lifecycle.service";
|
||||
import { KillswitchService } from "../../killswitch/killswitch.service";
|
||||
import { AgentEventsService } from "./agent-events.service";
|
||||
import { AgentMessagesService } from "./agent-messages.service";
|
||||
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
||||
|
||||
describe("AgentsController", () => {
|
||||
@@ -30,6 +31,11 @@ describe("AgentsController", () => {
|
||||
createHeartbeat: ReturnType<typeof vi.fn>;
|
||||
getRecentEvents: ReturnType<typeof vi.fn>;
|
||||
};
|
||||
let messagesService: {
|
||||
getMessages: ReturnType<typeof vi.fn>;
|
||||
getReplayMessages: ReturnType<typeof vi.fn>;
|
||||
getMessagesAfter: ReturnType<typeof vi.fn>;
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
// Create mock services
|
||||
@@ -69,13 +75,20 @@ describe("AgentsController", () => {
|
||||
getRecentEvents: vi.fn().mockReturnValue([]),
|
||||
};
|
||||
|
||||
messagesService = {
|
||||
getMessages: vi.fn(),
|
||||
getReplayMessages: vi.fn().mockResolvedValue([]),
|
||||
getMessagesAfter: vi.fn().mockResolvedValue([]),
|
||||
};
|
||||
|
||||
// Create controller with mocked services
|
||||
controller = new AgentsController(
|
||||
queueService as unknown as QueueService,
|
||||
spawnerService as unknown as AgentSpawnerService,
|
||||
lifecycleService as unknown as AgentLifecycleService,
|
||||
killswitchService as unknown as KillswitchService,
|
||||
eventsService as unknown as AgentEventsService
|
||||
eventsService as unknown as AgentEventsService,
|
||||
messagesService as unknown as AgentMessagesService
|
||||
);
|
||||
});
|
||||
|
||||
@@ -365,6 +378,52 @@ describe("AgentsController", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("getAgentMessages", () => {
|
||||
it("should return paginated message history", async () => {
|
||||
const agentId = "0b64079f-4487-42b9-92eb-cf8ea0042a64";
|
||||
const query = {
|
||||
limit: 25,
|
||||
skip: 10,
|
||||
};
|
||||
|
||||
const response = {
|
||||
messages: [
|
||||
{
|
||||
id: "msg-1",
|
||||
sessionId: agentId,
|
||||
role: "agent",
|
||||
content: "hello",
|
||||
provider: "internal",
|
||||
timestamp: new Date("2026-03-07T03:00:00.000Z"),
|
||||
metadata: {},
|
||||
},
|
||||
],
|
||||
total: 101,
|
||||
};
|
||||
|
||||
messagesService.getMessages.mockResolvedValue(response);
|
||||
|
||||
const result = await controller.getAgentMessages(agentId, query);
|
||||
|
||||
expect(messagesService.getMessages).toHaveBeenCalledWith(agentId, 25, 10);
|
||||
expect(result).toEqual(response);
|
||||
});
|
||||
|
||||
it("should use default pagination values", async () => {
|
||||
const agentId = "0b64079f-4487-42b9-92eb-cf8ea0042a64";
|
||||
const query = {
|
||||
limit: 50,
|
||||
skip: 0,
|
||||
};
|
||||
|
||||
messagesService.getMessages.mockResolvedValue({ messages: [], total: 0 });
|
||||
|
||||
await controller.getAgentMessages(agentId, query);
|
||||
|
||||
expect(messagesService.getMessages).toHaveBeenCalledWith(agentId, 50, 0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getRecentEvents", () => {
|
||||
it("should return recent events with default limit", () => {
|
||||
eventsService.getRecentEvents.mockReturnValue([
|
||||
|
||||
Reference in New Issue
Block a user