contract-identity.test.ts 3.6 KB

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