lifecycle.test.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { describe, expect } from "bun:test"
  2. import type {
  3. CloseSessionResponse,
  4. ListSessionsResponse,
  5. LoadSessionResponse,
  6. ResumeSessionResponse,
  7. } from "@agentclientprotocol/sdk"
  8. import { Duration, Effect } from "effect"
  9. import { cliIt } from "../../lib/cli-process"
  10. import { expectOk, selectConfigOption } from "./acp-test-client"
  11. import { createAcpClient, initialize, newSession, verifierConfig } from "./helpers"
  12. describe("kirincode acp lifecycle subprocess", () => {
  13. cliIt.live(
  14. "stdin EOF exits cleanly",
  15. ({ kirincode }) =>
  16. Effect.gen(function* () {
  17. const acp = yield* kirincode.acp()
  18. acp.close()
  19. const code = yield* Effect.promise(() => acp.exited).pipe(Effect.timeout(Duration.seconds(5)))
  20. expect(code).toBe(0)
  21. }),
  22. 60_000,
  23. )
  24. cliIt.live(
  25. "close capability and close request",
  26. ({ home, llm, kirincode }) =>
  27. Effect.gen(function* () {
  28. const acp = yield* createAcpClient(
  29. { kirincode },
  30. { KIRINCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) },
  31. )
  32. const initialized = yield* initialize(acp)
  33. expect(initialized.agentCapabilities?.sessionCapabilities?.close).toEqual({})
  34. const session = yield* newSession(acp, home)
  35. expectOk(yield* acp.request<CloseSessionResponse>("session/close", { sessionId: session.sessionId }))
  36. }),
  37. 60_000,
  38. )
  39. cliIt.live(
  40. "loadSession capability and load request return session config options",
  41. ({ home, llm, kirincode }) =>
  42. Effect.gen(function* () {
  43. const acp = yield* createAcpClient(
  44. { kirincode },
  45. { KIRINCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) },
  46. )
  47. const initialized = yield* initialize(acp)
  48. expect(initialized.agentCapabilities?.loadSession).toBe(true)
  49. const session = yield* newSession(acp, home)
  50. const loaded = expectOk(
  51. yield* acp.request<LoadSessionResponse>("session/load", {
  52. cwd: home,
  53. sessionId: session.sessionId,
  54. mcpServers: [],
  55. }),
  56. )
  57. expect(selectConfigOption(loaded.configOptions, "model")?.category).toBe("model")
  58. }),
  59. 60_000,
  60. )
  61. cliIt.live(
  62. "list request includes a live ACP-created session",
  63. ({ home, llm, kirincode }) =>
  64. Effect.gen(function* () {
  65. const acp = yield* createAcpClient(
  66. { kirincode },
  67. { KIRINCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) },
  68. )
  69. yield* initialize(acp)
  70. const session = yield* newSession(acp, home)
  71. const listed = expectOk(yield* acp.request<ListSessionsResponse>("session/list", { cwd: home }))
  72. expect(listed.sessions.some((item) => item.sessionId === session.sessionId)).toBe(true)
  73. }),
  74. 60_000,
  75. )
  76. cliIt.live(
  77. "resume capability advertisement",
  78. ({ kirincode }) =>
  79. Effect.gen(function* () {
  80. const initialized = yield* initialize(yield* createAcpClient({ kirincode }))
  81. expect(initialized.agentCapabilities?.sessionCapabilities?.resume).toEqual({})
  82. }),
  83. 60_000,
  84. )
  85. cliIt.live(
  86. "resume request returns session config options",
  87. ({ home, llm, kirincode }) =>
  88. Effect.gen(function* () {
  89. const acp = yield* createAcpClient(
  90. { kirincode },
  91. { KIRINCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) },
  92. )
  93. yield* initialize(acp)
  94. const session = yield* newSession(acp, home)
  95. const resumed = expectOk(
  96. yield* acp.request<ResumeSessionResponse>("session/resume", {
  97. cwd: home,
  98. sessionId: session.sessionId,
  99. mcpServers: [],
  100. }),
  101. )
  102. expect(selectConfigOption(resumed.configOptions, "model")?.category).toBe("model")
  103. }),
  104. 60_000,
  105. )
  106. })