72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { Effect, Layer, ManagedRuntime } from "effect"
|
|
import { MessageID, SessionID } from "../../src/session/schema"
|
|
import { provideTmpdirInstance } from "../fixture/fixture"
|
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
|
import { AgentManagerTool } from "../../src/kilocode/tool/agent-manager"
|
|
import { Bus } from "../../src/bus"
|
|
import { Tool } from "../../src/tool/tool"
|
|
import { Truncate } from "../../src/tool/truncate"
|
|
import { Agent } from "../../src/agent/agent"
|
|
|
|
const runtime = ManagedRuntime.make(
|
|
Layer.mergeAll(Truncate.defaultLayer, Agent.defaultLayer, Bus.defaultLayer, CrossSpawnSpawner.defaultLayer),
|
|
)
|
|
|
|
async function init() {
|
|
return runtime.runPromise(
|
|
Effect.gen(function* () {
|
|
const info = yield* AgentManagerTool
|
|
return yield* Tool.init(info)
|
|
}),
|
|
)
|
|
}
|
|
|
|
const ctx = {
|
|
sessionID: SessionID.make("ses_test"),
|
|
messageID: MessageID.make("msg_test"),
|
|
callID: "call_agent_manager",
|
|
agent: "build",
|
|
abort: AbortSignal.any([]),
|
|
messages: [],
|
|
metadata: () => Effect.void,
|
|
ask: () => Effect.void,
|
|
}
|
|
|
|
describe("agent_manager tool", () => {
|
|
test("asks for agent_manager permission", async () => {
|
|
const tool = await init()
|
|
const calls: unknown[] = []
|
|
|
|
await runtime.runPromise(
|
|
provideTmpdirInstance(() =>
|
|
tool.execute(
|
|
{ mode: "local", tasks: [{ prompt: "Fix issue" }] },
|
|
{ ...ctx, ask: (input: unknown) => Effect.sync(() => calls.push(input)) },
|
|
),
|
|
).pipe(Effect.scoped),
|
|
)
|
|
|
|
expect(calls).toEqual([
|
|
{
|
|
permission: "agent_manager",
|
|
patterns: ["local"],
|
|
always: ["local"],
|
|
metadata: { mode: "local", count: 1 },
|
|
},
|
|
])
|
|
})
|
|
|
|
test("rejects empty tasks", async () => {
|
|
const tool = await init()
|
|
|
|
await expect(
|
|
runtime.runPromise(
|
|
provideTmpdirInstance(() =>
|
|
tool.execute({ mode: "local", tasks: [{}] }, { ...ctx, ask: () => Effect.void }),
|
|
).pipe(Effect.scoped),
|
|
),
|
|
).rejects.toThrow("Each task must include prompt, name, or branchName")
|
|
})
|
|
})
|