|
|
@@ -1,6 +1,6 @@
|
|
|
import * as Log from "@opencode-ai/core/util/log"
|
|
|
-import { bootstrap } from "../bootstrap"
|
|
|
-import { cmd } from "./cmd"
|
|
|
+import { Effect } from "effect"
|
|
|
+import { effectCmd } from "../effect-cmd"
|
|
|
import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"
|
|
|
import { ACP } from "@/acp/agent"
|
|
|
import { Server } from "@/server/server"
|
|
|
@@ -9,7 +9,7 @@ import { withNetworkOptions, resolveNetworkOptions } from "../network"
|
|
|
|
|
|
const log = Log.create({ service: "acp-command" })
|
|
|
|
|
|
-export const AcpCommand = cmd({
|
|
|
+export const AcpCommand = effectCmd({
|
|
|
command: "acp",
|
|
|
describe: "start ACP (Agent Client Protocol) server",
|
|
|
builder: (yargs) => {
|
|
|
@@ -19,52 +19,53 @@ export const AcpCommand = cmd({
|
|
|
default: process.cwd(),
|
|
|
})
|
|
|
},
|
|
|
- handler: async (args) => {
|
|
|
+ handler: Effect.fn("Cli.acp")(function* (args) {
|
|
|
process.env.OPENCODE_CLIENT = "acp"
|
|
|
- await bootstrap(process.cwd(), async () => {
|
|
|
- const opts = await resolveNetworkOptions(args)
|
|
|
- const server = await Server.listen(opts)
|
|
|
+ const opts = yield* Effect.promise(() => resolveNetworkOptions(args))
|
|
|
+ const server = yield* Effect.promise(() => Server.listen(opts))
|
|
|
|
|
|
- const sdk = createOpencodeClient({
|
|
|
- baseUrl: `http://${server.hostname}:${server.port}`,
|
|
|
- })
|
|
|
+ const sdk = createOpencodeClient({
|
|
|
+ baseUrl: `http://${server.hostname}:${server.port}`,
|
|
|
+ })
|
|
|
|
|
|
- const input = new WritableStream<Uint8Array>({
|
|
|
- write(chunk) {
|
|
|
- return new Promise<void>((resolve, reject) => {
|
|
|
- process.stdout.write(chunk, (err) => {
|
|
|
- if (err) {
|
|
|
- reject(err)
|
|
|
- } else {
|
|
|
- resolve()
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
- })
|
|
|
- const output = new ReadableStream<Uint8Array>({
|
|
|
- start(controller) {
|
|
|
- process.stdin.on("data", (chunk: Buffer) => {
|
|
|
- controller.enqueue(new Uint8Array(chunk))
|
|
|
+ const input = new WritableStream<Uint8Array>({
|
|
|
+ write(chunk) {
|
|
|
+ return new Promise<void>((resolve, reject) => {
|
|
|
+ process.stdout.write(chunk, (err) => {
|
|
|
+ if (err) {
|
|
|
+ reject(err)
|
|
|
+ } else {
|
|
|
+ resolve()
|
|
|
+ }
|
|
|
})
|
|
|
- process.stdin.on("end", () => controller.close())
|
|
|
- process.stdin.on("error", (err) => controller.error(err))
|
|
|
- },
|
|
|
- })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ })
|
|
|
+ const output = new ReadableStream<Uint8Array>({
|
|
|
+ start(controller) {
|
|
|
+ process.stdin.on("data", (chunk: Buffer) => {
|
|
|
+ controller.enqueue(new Uint8Array(chunk))
|
|
|
+ })
|
|
|
+ process.stdin.on("end", () => controller.close())
|
|
|
+ process.stdin.on("error", (err) => controller.error(err))
|
|
|
+ },
|
|
|
+ })
|
|
|
|
|
|
- const stream = ndJsonStream(input, output)
|
|
|
- const agent = await ACP.init({ sdk })
|
|
|
+ const stream = ndJsonStream(input, output)
|
|
|
+ const agent = yield* Effect.promise(() => ACP.init({ sdk }))
|
|
|
|
|
|
- new AgentSideConnection((conn) => {
|
|
|
- return agent.create(conn, { sdk })
|
|
|
- }, stream)
|
|
|
+ new AgentSideConnection((conn) => {
|
|
|
+ return agent.create(conn, { sdk })
|
|
|
+ }, stream)
|
|
|
|
|
|
- log.info("setup connection")
|
|
|
- process.stdin.resume()
|
|
|
- await new Promise((resolve, reject) => {
|
|
|
- process.stdin.on("end", resolve)
|
|
|
- process.stdin.on("error", reject)
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
+ log.info("setup connection")
|
|
|
+ process.stdin.resume()
|
|
|
+ yield* Effect.promise(
|
|
|
+ () =>
|
|
|
+ new Promise<void>((resolve, reject) => {
|
|
|
+ process.stdin.on("end", () => resolve())
|
|
|
+ process.stdin.on("error", reject)
|
|
|
+ }),
|
|
|
+ )
|
|
|
+ }),
|
|
|
})
|