import * as Console from "effect/Console";import * as Effect from "effect/Effect";import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; import * as NodeRuntime from "@effect/platform-node/NodeRuntime";import * as NodeServices from "@effect/platform-node/NodeServices"; import * as CodexClient from "../../src/client.ts"; const program = Effect.gen(function* () { const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; const handle = yield* spawner.spawn( ChildProcess.make(process.env.CODEX_BIN ?? "codex", ["app-server"], { cwd: process.cwd(), shell: false, }), ); const codexLayer = CodexClient.layerChildProcess(handle, { logIncoming: true, logOutgoing: true, }); yield* Effect.gen(function* () { const client = yield* CodexClient.CodexAppServerClient; yield* client.handleServerRequest("item/tool/requestUserInput", (payload) => Effect.succeed({ answers: Object.fromEntries( payload.questions.map((question) => [ question.id, { answers: question.options && question.options.length > 0 ? [question.options[0]!.label] : ["ok"], }, ]), ), }), ); const initialized = yield* client.request("initialize", { clientInfo: { name: "effect-codex-app-server-probe", title: "Effect Codex App Server Probe", version: "0.0.0", }, capabilities: { experimentalApi: true, optOutNotificationMethods: null, }, }); yield* Console.log("initialize", initialized); yield* client.notify("initialized", undefined); const account = yield* client.request("account/read", {}); yield* Console.log("account/read", account); const skills = yield* client.request("skills/list", { cwds: [process.cwd()], }); yield* Console.log("skills/list", skills); }).pipe(Effect.provide(codexLayer));}); program.pipe(Effect.scoped, Effect.provide(NodeServices.layer), NodeRuntime.runMain);
import * as Console from "effect/Console";
import * as Effect from "effect/Effect";
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
import * as NodeServices from "@effect/platform-node/NodeServices";
import * as CodexClient from "../../src/client.ts";
const program = Effect.gen(function* () {
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
const handle = yield* spawner.spawn(
ChildProcess.make(process.env.CODEX_BIN ?? "codex", ["app-server"], {
cwd: process.cwd(),
shell: false,
}),
);
const codexLayer = CodexClient.layerChildProcess(handle, {
logIncoming: true,
logOutgoing: true,
});
yield* Effect.gen(function* () {
const client = yield* CodexClient.CodexAppServerClient;
yield* client.handleServerRequest("item/tool/requestUserInput", (payload) =>
Effect.succeed({
answers: Object.fromEntries(
payload.questions.map((question) => [
question.id,
{
answers:
question.options && question.options.length > 0
? [question.options[0]!.label]
: ["ok"],
},
]),
),
}),
);
const initialized = yield* client.request("initialize", {
clientInfo: {
name: "effect-codex-app-server-probe",
title: "Effect Codex App Server Probe",
version: "0.0.0",
},
capabilities: {
experimentalApi: true,
optOutNotificationMethods: null,
},
});
yield* Console.log("initialize", initialized);
yield* client.notify("initialized", undefined);
const account = yield* client.request("account/read", {});
yield* Console.log("account/read", account);
const skills = yield* client.request("skills/list", {
cwds: [process.cwd()],
});
yield* Console.log("skills/list", skills);
}).pipe(Effect.provide(codexLayer));
});
program.pipe(Effect.scoped, Effect.provide(NodeServices.layer), NodeRuntime.runMain);