lifecycle.subprocess.test.ts 3.8 KB

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