contract-identity.test.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { expect, test } from "bun:test"
  2. import { Location as CoreLocation } from "@opencode-ai/core/location"
  3. import { SessionInbox as CoreSessionInbox } from "@opencode-ai/core/session/inbox"
  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 { Event } from "@opencode-ai/schema/event"
  8. import { Location } from "@opencode-ai/schema/location"
  9. import { Model } from "@opencode-ai/schema/model"
  10. import { Project } from "@opencode-ai/schema/project"
  11. import { Provider } from "@opencode-ai/schema/provider"
  12. import { WebSearch } from "@opencode-ai/schema/websearch"
  13. import { Session } from "@opencode-ai/schema/session"
  14. import { SessionInbox } from "@opencode-ai/schema/session-inbox"
  15. import { SessionMessage } from "@opencode-ai/schema/session-message"
  16. import { Workspace } from "@opencode-ai/schema/workspace"
  17. import { Worktree } from "@opencode-ai/schema/worktree"
  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. const CoreAgent = await import("@opencode-ai/core/agent")
  23. const CoreModel = await import("@opencode-ai/core/model")
  24. const CoreProject = await import("@opencode-ai/core/project")
  25. const CoreSession = await import("@opencode-ai/core/session")
  26. const CoreWorktree = await import("@opencode-ai/core/worktree")
  27. test("re-exports canonical contracts directly from Schema", () => {
  28. expect(SDK.Agent).toBe(Agent)
  29. expect(SDK.Config).toBe(Config)
  30. expect(SDK.Event).toBe(Event)
  31. expect(SDK.Model).toBe(Model)
  32. expect(SDK.WebSearch).toBe(WebSearch)
  33. expect(SDK.Session).toBe(Session)
  34. expect(SDK.Worktree).toBe(Worktree)
  35. expect(SDK.Workspace).toBe(Workspace)
  36. expect(Object.keys(SDK).sort()).toEqual([
  37. "AbsolutePath",
  38. "Agent",
  39. "ClientError",
  40. "Command",
  41. "Config",
  42. "Credential",
  43. "Event",
  44. "FileSystem",
  45. "Integration",
  46. "Location",
  47. "Model",
  48. "OpenCode",
  49. "Permission",
  50. "PermissionSaved",
  51. "Project",
  52. "Prompt",
  53. "PromptInput",
  54. "Provider",
  55. "Pty",
  56. "Question",
  57. "Reference",
  58. "RelativePath",
  59. "Session",
  60. "SessionInbox",
  61. "SessionMessage",
  62. "Skill",
  63. "Tool",
  64. "WebSearch",
  65. "Workspace",
  66. "Worktree",
  67. ])
  68. })
  69. test("Core and Server reuse the authoritative Schema and Protocol values", () => {
  70. expect(CoreAgent.ID).toBe(Agent.ID)
  71. expect(CoreLocation.Ref).toBe(Location.Ref)
  72. expect(CoreModel.Ref).toBe(Model.Ref)
  73. expect(CoreSession.Info).toBe(Session.Info)
  74. expect(CoreProject.Current).toBe(Project.Current)
  75. expect(CoreWorktree.DirectoryUnavailableError).toBeDefined()
  76. expect(CoreWorktree.List).toBe(Worktree.List)
  77. expect(CoreWorktree.Info).toBe(Worktree.Info)
  78. expect(CoreSessionInbox.Item).toBe(SessionInbox.Item)
  79. expect(CoreSessionInbox.User).toBe(SessionInbox.User)
  80. expect(CoreSessionInbox.Synthetic).toBe(SessionInbox.Synthetic)
  81. expect(CoreSessionMessage.Info).toBe(SessionMessage.Info)
  82. expect(CoreSessionMessage.AssistantText).toBe(SessionMessage.AssistantText)
  83. expect(Api.groups["server.session"].identifier).toBe("server.session")
  84. expect(Api.groups["server.project"].identifier).toBe("server.project")
  85. expect(Object.keys(ClientApi.groups)).toEqual(Object.keys(Api.groups))
  86. expect(Session.ID.create()).toStartWith("ses_")
  87. expect(String(Project.ID.global)).toBe("global")
  88. expect(String(Provider.ID.anthropic)).toBe("anthropic")
  89. expect(Workspace.ID.create()).toStartWith("wrk_")
  90. })
  91. test("client and Server contracts generate identically", () => {
  92. const server = compile(Api, { groupNames, omitEndpoints: promiseOmitEndpoints })
  93. const client = compile(ClientApi, { groupNames, omitEndpoints: promiseOmitEndpoints })
  94. expect(emitPromise(client)).toEqual(emitPromise(server))
  95. })