contract-identity.test.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { expect, test } from "bun:test"
  2. import { AgentV2 } from "@opencode-ai/core/agent"
  3. import { Location as CoreLocation } from "@opencode-ai/core/location"
  4. import { ModelV2 } from "@opencode-ai/core/model"
  5. import { ProjectV2 } from "@opencode-ai/core/project"
  6. import { SessionV2 } from "@opencode-ai/core/session"
  7. import { SessionPending as CoreSessionPending } from "@opencode-ai/core/session/pending"
  8. import { SessionMessage as CoreSessionMessage } from "@opencode-ai/core/session/message"
  9. import { Agent } from "@opencode-ai/schema/agent"
  10. import { Location } from "@opencode-ai/schema/location"
  11. import { Model } from "@opencode-ai/schema/model"
  12. import { Project } from "@opencode-ai/schema/project"
  13. import { Provider } from "@opencode-ai/schema/provider"
  14. import { Session } from "@opencode-ai/schema/session"
  15. import { SessionPending } from "@opencode-ai/schema/session-pending"
  16. import { SessionMessage } from "@opencode-ai/schema/session-message"
  17. import { Workspace } from "@opencode-ai/schema/workspace"
  18. import { Api } from "@opencode-ai/server/api"
  19. import { ClientApi, groupNames, promiseOmitEndpoints } from "@opencode-ai/protocol/client"
  20. import { compile, emitPromise } from "@opencode-ai/httpapi-codegen"
  21. const SDK = await import("../src/index")
  22. test("re-exports canonical contracts directly from Schema", () => {
  23. expect(SDK.Agent).toBe(Agent)
  24. expect(SDK.Model).toBe(Model)
  25. expect(SDK.Session).toBe(Session)
  26. expect(Object.keys(SDK).sort()).toEqual([
  27. "AbsolutePath",
  28. "Agent",
  29. "ClientError",
  30. "Command",
  31. "Credential",
  32. "FileSystem",
  33. "Integration",
  34. "Location",
  35. "Model",
  36. "OpenCode",
  37. "Permission",
  38. "PermissionSaved",
  39. "Project",
  40. "ProjectCopy",
  41. "Prompt",
  42. "PromptInput",
  43. "Provider",
  44. "Pty",
  45. "Question",
  46. "Reference",
  47. "RelativePath",
  48. "Session",
  49. "SessionMessage",
  50. "SessionPending",
  51. "Skill",
  52. "Tool",
  53. ])
  54. })
  55. test("Core and Server reuse the authoritative Schema and Protocol values", () => {
  56. expect(AgentV2.ID).toBe(Agent.ID)
  57. expect(CoreLocation.Ref).toBe(Location.Ref)
  58. expect(ModelV2.Ref).toBe(Model.Ref)
  59. expect(SessionV2.Info).toBe(Session.Info)
  60. expect(ProjectV2.Current).toBe(Project.Current)
  61. expect(ProjectV2.Directory).toBe(Project.Directory)
  62. expect(ProjectV2.Directories).toBe(Project.Directories)
  63. expect(CoreSessionPending.Message).toBe(SessionPending.Message)
  64. expect(CoreSessionPending.User).toBe(SessionPending.User)
  65. expect(CoreSessionPending.Synthetic).toBe(SessionPending.Synthetic)
  66. expect(CoreSessionMessage.Info).toBe(SessionMessage.Info)
  67. expect(CoreSessionMessage.AssistantText).toBe(SessionMessage.AssistantText)
  68. expect(Api.groups["server.session"].identifier).toBe("server.session")
  69. expect(Api.groups["server.project"].identifier).toBe("server.project")
  70. expect(Object.keys(ClientApi.groups)).toEqual(Object.keys(Api.groups))
  71. expect(Session.ID.create()).toStartWith("ses_")
  72. expect(String(Project.ID.global)).toBe("global")
  73. expect(String(Provider.ID.anthropic)).toBe("anthropic")
  74. expect(Workspace.ID.create()).toStartWith("wrk_")
  75. })
  76. test("client and Server contracts generate identically", () => {
  77. const server = compile(Api, { groupNames, omitEndpoints: promiseOmitEndpoints })
  78. const client = compile(ClientApi, { groupNames, omitEndpoints: promiseOmitEndpoints })
  79. expect(emitPromise(client)).toEqual(emitPromise(server))
  80. })