lifecycle.subprocess.test.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import type {
  2. CloseSessionResponse,
  3. ListSessionsResponse,
  4. LoadSessionResponse,
  5. ResumeSessionResponse,
  6. } from "@agentclientprotocol/sdk"
  7. import { describe, expect, test } from "bun:test"
  8. import { createAcpFixture, expectOk, initialize, newSession, selectConfigOption } from "./subprocess"
  9. describe("acp lifecycle subprocess", () => {
  10. test("stdin EOF exits cleanly", async () => {
  11. await using fixture = await createAcpFixture()
  12. expect(await fixture.spawn().close()).toBe(0)
  13. }, 60_000)
  14. test("close capability and close request", async () => {
  15. await using fixture = await createAcpFixture()
  16. const acp = fixture.spawn()
  17. const initialized = await initialize(acp)
  18. expect(initialized.agentCapabilities?.sessionCapabilities?.close).toEqual({})
  19. const session = await newSession(acp, fixture.home)
  20. expect(
  21. expectOk(await acp.request<CloseSessionResponse>("session/close", { sessionId: session.sessionId })),
  22. ).toEqual({})
  23. }, 60_000)
  24. test("new session succeeds on the first request", async () => {
  25. await using fixture = await createAcpFixture()
  26. const acp = fixture.spawn()
  27. await initialize(acp)
  28. expect((await newSession(acp, fixture.home)).sessionId).toStartWith("ses_")
  29. }, 60_000)
  30. test("loadSession capability and load request return session config options", async () => {
  31. await using fixture = await createAcpFixture()
  32. const acp = fixture.spawn()
  33. const initialized = await initialize(acp)
  34. expect(initialized.agentCapabilities?.loadSession).toBe(true)
  35. const session = await newSession(acp, fixture.home)
  36. const loaded = expectOk(
  37. await acp.request<LoadSessionResponse>("session/load", {
  38. cwd: fixture.home,
  39. sessionId: session.sessionId,
  40. mcpServers: [],
  41. }),
  42. )
  43. expect(selectConfigOption(loaded.configOptions, "model")?.category).toBe("model")
  44. }, 60_000)
  45. test("list request includes a live ACP-created session", async () => {
  46. await using fixture = await createAcpFixture()
  47. const acp = fixture.spawn()
  48. await initialize(acp)
  49. const session = await newSession(acp, fixture.home)
  50. const listed = expectOk(await acp.request<ListSessionsResponse>("session/list", { cwd: fixture.home }))
  51. expect(listed.sessions.some((item) => item.sessionId === session.sessionId)).toBe(true)
  52. }, 60_000)
  53. test("resume capability advertisement", async () => {
  54. await using fixture = await createAcpFixture()
  55. const initialized = await initialize(fixture.spawn())
  56. expect(initialized.agentCapabilities?.sessionCapabilities?.resume).toEqual({})
  57. }, 60_000)
  58. test("resume request returns session config options", async () => {
  59. await using fixture = await createAcpFixture()
  60. const acp = fixture.spawn()
  61. await initialize(acp)
  62. const session = await newSession(acp, fixture.home)
  63. const resumed = expectOk(
  64. await acp.request<ResumeSessionResponse>("session/resume", {
  65. cwd: fixture.home,
  66. sessionId: session.sessionId,
  67. mcpServers: [],
  68. }),
  69. )
  70. expect(selectConfigOption(resumed.configOptions, "model")?.category).toBe("model")
  71. }, 60_000)
  72. })