import * as Effect from "effect/Effect";import * as Console from "effect/Console";import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; import * as NodeServices from "@effect/platform-node/NodeServices";import * as NodeRuntime from "@effect/platform-node/NodeRuntime"; import * as AcpClient from "../../src/client.ts"; const program = Effect.gen(function* () { const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; const command = ChildProcess.make("cursor-agent", ["acp"], { cwd: process.cwd(), shell: process.platform === "win32", }); const handle = yield* spawner.spawn(command); const acpLayer = AcpClient.layerChildProcess(handle, { logIncoming: true, logOutgoing: true, }); yield* Effect.gen(function* () { const acp = yield* AcpClient.AcpClient; yield* acp.handleRequestPermission(() => Effect.succeed({ outcome: { outcome: "selected", optionId: "allow", }, }), ); // yield* acp.handleSessionUpdate((notification) => // Console.log("session/update", JSON.stringify(notification)), // ); const initialized = yield* acp.agent.initialize({ protocolVersion: 1, clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false, _meta: { parameterizedModelPicker: true, }, }, clientInfo: { name: "effect-acp-example", version: "0.0.0", }, }); yield* Console.log("initialized", JSON.stringify(initialized, null, 4)); const session = yield* acp.agent.createSession({ cwd: process.cwd(), mcpServers: [], }); const config = yield* acp.agent.setSessionConfigOption({ sessionId: session.sessionId, configId: "model", value: "claude-opus-4-6", }); yield* Console.log("config", JSON.stringify(config, null, 4)); const result = yield* acp.agent.prompt({ sessionId: session.sessionId, prompt: [ { type: "text", text: "Illustrate your ability to create todo lists and then execute all of them. Do not write the list to disk, illustrate your built in ability!", }, ], }); yield* Console.log("prompt result", JSON.stringify(result)); yield* acp.agent.cancel({ sessionId: session.sessionId }); }).pipe(Effect.provide(acpLayer));}); program.pipe(Effect.scoped, Effect.provide(NodeServices.layer), NodeRuntime.runMain);
import * as Effect from "effect/Effect";
import * as Console from "effect/Console";
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
import * as NodeServices from "@effect/platform-node/NodeServices";
import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
import * as AcpClient from "../../src/client.ts";
const program = Effect.gen(function* () {
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
const command = ChildProcess.make("cursor-agent", ["acp"], {
cwd: process.cwd(),
shell: process.platform === "win32",
});
const handle = yield* spawner.spawn(command);
const acpLayer = AcpClient.layerChildProcess(handle, {
logIncoming: true,
logOutgoing: true,
});
yield* Effect.gen(function* () {
const acp = yield* AcpClient.AcpClient;
yield* acp.handleRequestPermission(() =>
Effect.succeed({
outcome: {
outcome: "selected",
optionId: "allow",
},
}),
);
// yield* acp.handleSessionUpdate((notification) =>
// Console.log("session/update", JSON.stringify(notification)),
// );
const initialized = yield* acp.agent.initialize({
protocolVersion: 1,
clientCapabilities: {
fs: { readTextFile: false, writeTextFile: false },
terminal: false,
_meta: {
parameterizedModelPicker: true,
},
},
clientInfo: {
name: "effect-acp-example",
version: "0.0.0",
},
});
yield* Console.log("initialized", JSON.stringify(initialized, null, 4));
const session = yield* acp.agent.createSession({
cwd: process.cwd(),
mcpServers: [],
});
const config = yield* acp.agent.setSessionConfigOption({
sessionId: session.sessionId,
configId: "model",
value: "claude-opus-4-6",
});
yield* Console.log("config", JSON.stringify(config, null, 4));
const result = yield* acp.agent.prompt({
sessionId: session.sessionId,
prompt: [
{
type: "text",
text: "Illustrate your ability to create todo lists and then execute all of them. Do not write the list to disk, illustrate your built in ability!",
},
],
});
yield* Console.log("prompt result", JSON.stringify(result));
yield* acp.agent.cancel({ sessionId: session.sessionId });
}).pipe(Effect.provide(acpLayer));
});
program.pipe(Effect.scoped, Effect.provide(NodeServices.layer), NodeRuntime.runMain);