initialize-auth.subprocess.test.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import type { AuthenticateResponse, InitializeResponse } from "@agentclientprotocol/sdk"
  2. import { describe, expect, test } from "bun:test"
  3. import { createAcpFixture, expectOk, initialize } from "./subprocess"
  4. describe("acp initialize/auth subprocess", () => {
  5. test("initialize responds with capabilities", async () => {
  6. await using fixture = await createAcpFixture()
  7. const initialized = await initialize(fixture.spawn())
  8. expect(initialized.protocolVersion).toBe(1)
  9. expect(initialized.agentCapabilities?.promptCapabilities?.embeddedContext).toBe(true)
  10. expect(initialized.agentCapabilities?.promptCapabilities?.image).toBe(true)
  11. expect(initialized.agentCapabilities?.mcpCapabilities?.http).toBe(true)
  12. expect(initialized.agentCapabilities?.mcpCapabilities?.sse).toBe(false)
  13. expect(initialized.agentCapabilities?.loadSession).toBe(true)
  14. expect(initialized.agentCapabilities?.sessionCapabilities?.close).toEqual({})
  15. expect(initialized.agentCapabilities?.sessionCapabilities?.fork).toEqual({})
  16. expect(initialized.agentCapabilities?.sessionCapabilities?.list).toEqual({})
  17. expect(initialized.agentCapabilities?.sessionCapabilities?.resume).toEqual({})
  18. expect(initialized.agentInfo?.name).toBe("OpenCode")
  19. }, 60_000)
  20. test("auth negotiation is explicit and safe", async () => {
  21. await using fixture = await createAcpFixture()
  22. const secret = "subprocess-auth-secret"
  23. const acp = fixture.spawn({ OPENCODE_AUTH_CONTENT: secret })
  24. const initialized = await initialize(acp)
  25. expect(initialized.authMethods?.[0]?.id).toBe("opencode-login")
  26. expect(initialized.authMethods?.[0]?._meta?.["terminal-auth"]).toBeDefined()
  27. expect(expectOk(await acp.request<AuthenticateResponse>("authenticate", { methodId: "opencode-login" }))).toEqual(
  28. {},
  29. )
  30. const rejected = await acp.request<AuthenticateResponse>("authenticate", { methodId: "missing-auth-method" })
  31. expect(rejected.error?.code).toBe(-32602)
  32. expect(JSON.stringify(rejected.error)).not.toContain(secret)
  33. }, 60_000)
  34. test("initialize without terminal-auth metadata keeps auth command implicit", async () => {
  35. await using fixture = await createAcpFixture()
  36. const initialized = expectOk(
  37. await fixture.spawn().request<InitializeResponse>("initialize", { protocolVersion: 1 }),
  38. )
  39. expect(initialized.authMethods?.[0]?.id).toBe("opencode-login")
  40. expect(initialized.authMethods?.[0]?._meta?.["terminal-auth"]).toBeUndefined()
  41. }, 60_000)
  42. })