| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- import { expect, test } from "bun:test"
- import { Schema } from "effect"
- import { AgentV2 } from "@opencode-ai/core/agent"
- import { ModelV2 } from "@opencode-ai/core/model"
- import { SessionV2 } from "@opencode-ai/core/session"
- import { Agent } from "@opencode-ai/schema/agent"
- import { Location } from "@opencode-ai/schema/location"
- import { Model } from "@opencode-ai/schema/model"
- import { AgentAttachment, FileAttachment, Prompt, Source } from "@opencode-ai/schema/prompt"
- import { Provider } from "@opencode-ai/schema/provider"
- import { Project } from "@opencode-ai/schema/project"
- import { ProjectDirectories } from "@opencode-ai/schema/project-directories"
- import { PermissionV1 } from "@opencode-ai/schema/permission-v1"
- import { Session } from "@opencode-ai/schema/session"
- import { SessionInput } from "@opencode-ai/schema/session-input"
- import { SessionMessage } from "@opencode-ai/schema/session-message"
- import { Workspace } from "@opencode-ai/schema/workspace"
- import { Command } from "@opencode-ai/schema/command"
- import { Connection } from "@opencode-ai/schema/connection"
- import { Credential } from "@opencode-ai/schema/credential"
- import { FileSystem } from "@opencode-ai/schema/filesystem"
- import { Integration } from "@opencode-ai/schema/integration"
- import { LLM } from "@opencode-ai/schema/llm"
- import { Permission } from "@opencode-ai/schema/permission"
- import { Plugin } from "@opencode-ai/schema/plugin"
- import { Pty } from "@opencode-ai/schema/pty"
- import { Reference } from "@opencode-ai/schema/reference"
- import { SessionTodo } from "@opencode-ai/schema/session-todo"
- import { Skill } from "@opencode-ai/schema/skill"
- import { AbsolutePath, DateTimeUtcFromMillis, optional, statics } from "@opencode-ai/schema/schema"
- import { ProviderV2 } from "@opencode-ai/core/provider"
- import { PluginV2 } from "@opencode-ai/core/plugin"
- test("Core reuses the canonical shared schemas", async () => {
- const [
- coreCommand,
- coreConnection,
- coreCredential,
- coreFileSystem,
- coreIntegration,
- coreLocation,
- coreLLM,
- corePermission,
- corePermissionV1,
- coreProjectCopy,
- corePty,
- coreProject,
- coreReference,
- coreSessionInput,
- coreSessionMessage,
- coreSessionTodo,
- corePrompt,
- coreSkill,
- coreV2Schema,
- coreSchema,
- coreWorkspace,
- ] = await Promise.all([
- import("@opencode-ai/core/command"),
- import("@opencode-ai/core/integration/connection"),
- import("@opencode-ai/core/credential"),
- import("@opencode-ai/core/filesystem"),
- import("@opencode-ai/core/integration"),
- import("@opencode-ai/core/location"),
- import("@opencode-ai/llm"),
- import("@opencode-ai/core/permission"),
- import("@opencode-ai/core/v1/permission"),
- import("@opencode-ai/core/project/copy"),
- import("@opencode-ai/core/pty"),
- import("@opencode-ai/core/project/schema"),
- import("@opencode-ai/core/reference"),
- import("@opencode-ai/core/session/input"),
- import("@opencode-ai/core/session/message"),
- import("@opencode-ai/core/session/todo"),
- import("@opencode-ai/core/session/prompt"),
- import("@opencode-ai/core/skill"),
- import("@opencode-ai/core/v2-schema"),
- import("@opencode-ai/core/schema"),
- import("@opencode-ai/core/workspace"),
- ])
- const schemas = [
- [AgentV2.ID, Agent.ID],
- [AgentV2.Color, Agent.Color],
- [AgentV2.Info, Agent.Info],
- [coreCommand.Info, Command.Info],
- [coreConnection.CredentialInfo, Connection.CredentialInfo],
- [coreConnection.EnvInfo, Connection.EnvInfo],
- [coreConnection.Info, Connection.Info],
- [coreCredential.ID, Credential.ID],
- [coreCredential.OAuth, Credential.OAuth],
- [coreCredential.Key, Credential.Key],
- [coreCredential.Value, Credential.Value],
- [coreFileSystem.Entry, FileSystem.Entry],
- [coreFileSystem.Submatch, FileSystem.Submatch],
- [coreFileSystem.Match, FileSystem.Match],
- [coreIntegration.ID, Integration.ID],
- [coreIntegration.MethodID, Integration.MethodID],
- [coreIntegration.When, Integration.When],
- [coreIntegration.TextPrompt, Integration.TextPrompt],
- [coreIntegration.SelectPrompt, Integration.SelectPrompt],
- [coreIntegration.Prompt, Integration.Prompt],
- [coreIntegration.OAuthMethod, Integration.OAuthMethod],
- [coreIntegration.KeyMethod, Integration.KeyMethod],
- [coreIntegration.EnvMethod, Integration.EnvMethod],
- [coreIntegration.Method, Integration.Method],
- [coreIntegration.Inputs, Integration.Inputs],
- [coreIntegration.Ref, Integration.Ref],
- [coreLocation.Ref, Location.Ref],
- [coreLLM.ProviderMetadata, LLM.ProviderMetadata],
- [coreLLM.ToolTextContent, LLM.ToolTextContent],
- [coreLLM.ToolFileContent, LLM.ToolFileContent],
- [coreLLM.ToolContent, LLM.ToolContent],
- [ModelV2.ID, Model.ID],
- [ModelV2.VariantID, Model.VariantID],
- [ModelV2.Ref, Model.Ref],
- [ModelV2.Family, Model.Family],
- [ModelV2.Capabilities, Model.Capabilities],
- [ModelV2.Cost, Model.Cost],
- [ModelV2.Api, Model.Api],
- [ModelV2.Info, Model.Info],
- [ProviderV2.ID, Provider.ID],
- [ProviderV2.AISDK, Provider.AISDK],
- [ProviderV2.Native, Provider.Native],
- [ProviderV2.Api, Provider.Api],
- [ProviderV2.Request, Provider.Request],
- [ProviderV2.Info, Provider.Info],
- [corePermission.Effect, Permission.Effect],
- [corePermission.Rule, Permission.Rule],
- [corePermission.Ruleset, Permission.Ruleset],
- [corePermissionV1.Event, PermissionV1.Event],
- [coreProjectCopy.Event, ProjectDirectories.Event],
- [PluginV2.ID, Plugin.ID],
- [PluginV2.Event, Plugin.Event],
- [corePty.Info, Pty.Info],
- [corePty.Event, Pty.Event],
- [coreProject.ID, Project.ID],
- [coreReference.LocalSource, Reference.LocalSource],
- [coreReference.GitSource, Reference.GitSource],
- [coreReference.Source, Reference.Source],
- [SessionV2.ID, Session.ID],
- [SessionV2.Info, Session.Info],
- [SessionV2.ListAnchor, Session.ListAnchor],
- [coreSessionInput.Delivery, SessionInput.Delivery],
- [coreSessionInput.Admitted, SessionInput.Admitted],
- [coreSessionMessage.ID, SessionMessage.ID],
- [coreSessionMessage.UnknownError, SessionMessage.UnknownError],
- [coreSessionMessage.AgentSwitched, SessionMessage.AgentSwitched],
- [coreSessionMessage.ModelSwitched, SessionMessage.ModelSwitched],
- [coreSessionMessage.User, SessionMessage.User],
- [coreSessionMessage.Synthetic, SessionMessage.Synthetic],
- [coreSessionMessage.System, SessionMessage.System],
- [coreSessionMessage.Shell, SessionMessage.Shell],
- [coreSessionMessage.ToolStatePending, SessionMessage.ToolStatePending],
- [coreSessionMessage.ToolStateRunning, SessionMessage.ToolStateRunning],
- [coreSessionMessage.ToolStateCompleted, SessionMessage.ToolStateCompleted],
- [coreSessionMessage.ToolStateError, SessionMessage.ToolStateError],
- [coreSessionMessage.ToolState, SessionMessage.ToolState],
- [coreSessionMessage.AssistantTool, SessionMessage.AssistantTool],
- [coreSessionMessage.AssistantText, SessionMessage.AssistantText],
- [coreSessionMessage.AssistantReasoning, SessionMessage.AssistantReasoning],
- [coreSessionMessage.AssistantContent, SessionMessage.AssistantContent],
- [coreSessionMessage.Assistant, SessionMessage.Assistant],
- [coreSessionMessage.Compaction, SessionMessage.Compaction],
- [coreSessionMessage.Message, SessionMessage.Message],
- [coreSessionTodo.Info, SessionTodo.Info],
- [coreSessionTodo.Event, SessionTodo.Event],
- [corePrompt.Source, Source],
- [corePrompt.FileAttachment, FileAttachment],
- [corePrompt.AgentAttachment, AgentAttachment],
- [corePrompt.Prompt, Prompt],
- [coreSkill.DirectorySource, Skill.DirectorySource],
- [coreSkill.UrlSource, Skill.UrlSource],
- [coreSkill.EmbeddedSource, Skill.EmbeddedSource],
- [coreSkill.Source, Skill.Source],
- [coreSkill.Info, Skill.Info],
- [coreV2Schema.DateTimeUtcFromMillis, DateTimeUtcFromMillis],
- [coreSchema.optional, optional],
- [coreSchema.statics, statics],
- [coreWorkspace.ID, Workspace.ID],
- ]
- for (const [core, shared] of schemas) expect(core).toBe(shared)
- expect(Agent.Info.empty(Agent.ID.make("test"))).toEqual(AgentV2.Info.empty(AgentV2.ID.make("test")))
- expect(Model.Info.empty(Provider.ID.make("test"), Model.ID.make("model"))).toEqual(
- ModelV2.Info.empty(ProviderV2.ID.make("test"), ModelV2.ID.make("model")),
- )
- expect(Provider.Info.empty(Provider.ID.make("test"))).toEqual(ProviderV2.Info.empty(ProviderV2.ID.make("test")))
- expect(Skill.Source.key(Skill.DirectorySource.make({ type: "directory", path: AbsolutePath.make("/tmp") }))).toBe(
- "directory:/tmp",
- )
- })
- test("shared record schemas construct and decode plain objects", () => {
- const made = Prompt.make({ text: "hello" })
- const decoded = Schema.decodeUnknownSync(Prompt)({ text: "hello" })
- const content = Schema.decodeUnknownSync(SessionMessage.AssistantText)({ type: "text", id: "part_1", text: "hi" })
- expect(Object.getPrototypeOf(made)).toBe(Object.prototype)
- expect(Object.getPrototypeOf(decoded)).toBe(Object.prototype)
- expect(Object.getPrototypeOf(content)).toBe(Object.prototype)
- expect(Prompt.ast.annotations?.identifier).toBe("Prompt")
- expect(SessionMessage.AssistantText.ast.annotations?.identifier).toBe("Session.Message.Assistant.Text")
- expect(Prompt.equivalence(Prompt.make({ text: "hello" }), decoded)).toBe(true)
- expect(Prompt.fromUserMessage({ text: "hello" })).toEqual(made)
- expect(Workspace.ID.ascending("")).toStartWith("wrk_")
- })
|