server.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"
  2. import { Log } from "../util/log"
  3. import { Instance } from "../project/instance"
  4. import { OpenCodeAgent } from "./agent"
  5. export namespace ACPServer {
  6. const log = Log.create({ service: "acp-server" })
  7. export async function start() {
  8. await Instance.provide({
  9. directory: process.cwd(),
  10. fn: async () => {
  11. log.info("starting ACP server", { cwd: process.cwd() })
  12. const stdout = new WritableStream({
  13. write(chunk) {
  14. process.stdout.write(chunk)
  15. },
  16. })
  17. const stdin = new ReadableStream({
  18. start(controller) {
  19. process.stdin.on("data", (chunk) => {
  20. controller.enqueue(new Uint8Array(chunk))
  21. })
  22. process.stdin.on("end", () => {
  23. controller.close()
  24. })
  25. },
  26. })
  27. const stream = ndJsonStream(stdout, stdin)
  28. new AgentSideConnection((conn) => {
  29. return new OpenCodeAgent(conn)
  30. }, stream)
  31. await new Promise<void>((resolve) => {
  32. process.on("SIGTERM", () => {
  33. log.info("received SIGTERM")
  34. resolve()
  35. })
  36. process.on("SIGINT", () => {
  37. log.info("received SIGINT")
  38. resolve()
  39. })
  40. })
  41. log.info("ACP server stopped")
  42. },
  43. })
  44. }
  45. }