diff --git a/packages/agent/src/harness/factory.ts b/packages/agent/src/harness/factory.ts new file mode 100644 index 00000000..58edaca2 --- /dev/null +++ b/packages/agent/src/harness/factory.ts @@ -0,0 +1,13 @@ +import { DefaultAgentHarness } from "./agent-harness.js"; +import { DefaultSession } from "./session/session.js"; +import type { AgentHarness, AgentHarnessOptions, Session, SessionMetadata, SessionStorage } from "./types.js"; + +export function createSession( + storage: SessionStorage, +): Session { + return new DefaultSession(storage); +} + +export function createAgentHarness(options: AgentHarnessOptions): AgentHarness { + return new DefaultAgentHarness(options); +} diff --git a/packages/agent/src/index.ts b/packages/agent/src/index.ts index d48629a4..e4b7f66f 100644 --- a/packages/agent/src/index.ts +++ b/packages/agent/src/index.ts @@ -23,6 +23,7 @@ export { shouldCompact, } from "./harness/compaction/compaction.js"; export * from "./harness/execution-env.js"; +export * from "./harness/factory.js"; export * from "./harness/messages.js"; export * from "./harness/prompt-templates.js"; export * from "./harness/session/repo/jsonl.js"; diff --git a/packages/agent/test/harness/factory.test.ts b/packages/agent/test/harness/factory.test.ts new file mode 100644 index 00000000..ec00b1c4 --- /dev/null +++ b/packages/agent/test/harness/factory.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from "vitest"; +import { Agent } from "../../src/agent.js"; +import { NodeExecutionEnv } from "../../src/harness/execution-env.js"; +import { createAgentHarness, createSession } from "../../src/harness/factory.js"; +import { InMemorySessionStorage } from "../../src/harness/session/storage/memory.js"; + +describe("harness factories", () => { + it("creates sessions from storage", async () => { + const storage = new InMemorySessionStorage({ + metadata: { id: "session-1", createdAt: "2026-01-01T00:00:00.000Z" }, + }); + const session = createSession(storage); + expect(session.getStorage()).toBe(storage); + expect(await session.getMetadata()).toEqual({ id: "session-1", createdAt: "2026-01-01T00:00:00.000Z" }); + }); + + it("creates agent harnesses", () => { + const session = createSession(new InMemorySessionStorage()); + const env = new NodeExecutionEnv({ cwd: process.cwd() }); + const agent = new Agent(); + const harness = createAgentHarness({ agent, env, session }); + expect(harness.agent).toBe(agent); + expect(harness.conversation.session).toBe(session); + }); +});