build.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { NodeFileSystem } from "@effect/platform-node"
  2. import { compile, emitEffectImported, emitEffectShape, emitPromise, write } from "@opencode-ai/httpapi-codegen"
  3. import {
  4. ClientApi,
  5. effectOmitEndpoints,
  6. groupNames,
  7. promiseOmitEndpoints,
  8. } from "@opencode-ai/protocol/client"
  9. import { Agent } from "@opencode-ai/schema/agent"
  10. import { Command } from "@opencode-ai/schema/command"
  11. import { Config } from "@opencode-ai/schema/config"
  12. import { Credential } from "@opencode-ai/schema/credential"
  13. import { Event } from "@opencode-ai/schema/event"
  14. import { EventLog } from "@opencode-ai/schema/event-log"
  15. import { FileDiff } from "@opencode-ai/schema/file-diff"
  16. import { FileSystem } from "@opencode-ai/schema/filesystem"
  17. import { Form } from "@opencode-ai/schema/form"
  18. import { InstructionEntry } from "@opencode-ai/schema/instruction-entry"
  19. import { Integration } from "@opencode-ai/schema/integration"
  20. import { Location } from "@opencode-ai/schema/location"
  21. import { Mcp } from "@opencode-ai/schema/mcp"
  22. import { Model } from "@opencode-ai/schema/model"
  23. import { Permission } from "@opencode-ai/schema/permission"
  24. import { PermissionSaved } from "@opencode-ai/schema/permission-saved"
  25. import { Plugin } from "@opencode-ai/schema/plugin"
  26. import { Project } from "@opencode-ai/schema/project"
  27. import { ProjectCopy } from "@opencode-ai/schema/project-copy"
  28. import { AgentAttachment, FileAttachment, Prompt, PromptMention } from "@opencode-ai/schema/prompt"
  29. import { PromptInput } from "@opencode-ai/schema/prompt-input"
  30. import { Provider } from "@opencode-ai/schema/provider"
  31. import { Pty } from "@opencode-ai/schema/pty"
  32. import { PtyTicket } from "@opencode-ai/schema/pty-ticket"
  33. import { Question } from "@opencode-ai/schema/question"
  34. import { Reference } from "@opencode-ai/schema/reference"
  35. import { AbsolutePath, PositiveInt, RelativePath } from "@opencode-ai/schema/schema"
  36. import { Session } from "@opencode-ai/schema/session"
  37. import { SessionMessage } from "@opencode-ai/schema/session-message"
  38. import { SessionPending } from "@opencode-ai/schema/session-pending"
  39. import { Shell } from "@opencode-ai/schema/shell"
  40. import { Skill } from "@opencode-ai/schema/skill"
  41. import { Vcs } from "@opencode-ai/schema/vcs"
  42. import { WebSearch } from "@opencode-ai/schema/websearch"
  43. import { Workspace } from "@opencode-ai/schema/workspace"
  44. import { Effect, Schema } from "effect"
  45. import { fileURLToPath } from "url"
  46. const promiseContract = compile(ClientApi, { groupNames, omitEndpoints: promiseOmitEndpoints })
  47. const effectContract = compile(ClientApi, { groupNames, omitEndpoints: effectOmitEndpoints })
  48. const effectTypeReferences = [
  49. ...namespaceTypes("Agent", "@opencode-ai/schema/agent", Agent),
  50. ...namespaceTypes("Command", "@opencode-ai/schema/command", Command),
  51. ...namespaceTypes("Config", "@opencode-ai/schema/config", Config),
  52. ...namespaceTypes("Credential", "@opencode-ai/schema/credential", Credential),
  53. ...namespaceTypes("Event", "@opencode-ai/schema/event", Event),
  54. ...namespaceTypes("EventLog", "@opencode-ai/schema/event-log", EventLog),
  55. ...namespaceTypes("FileDiff", "@opencode-ai/schema/file-diff", FileDiff),
  56. ...namespaceTypes("FileSystem", "@opencode-ai/schema/filesystem", FileSystem),
  57. ...namespaceTypes("Form", "@opencode-ai/schema/form", Form),
  58. ...namespaceTypes("InstructionEntry", "@opencode-ai/schema/instruction-entry", InstructionEntry),
  59. ...namespaceTypes("Integration", "@opencode-ai/schema/integration", Integration),
  60. ...namespaceTypes("Location", "@opencode-ai/schema/location", Location),
  61. ...namespaceTypes("Mcp", "@opencode-ai/schema/mcp", Mcp),
  62. ...namespaceTypes("Model", "@opencode-ai/schema/model", Model),
  63. ...namespaceTypes("Permission", "@opencode-ai/schema/permission", Permission),
  64. ...namespaceTypes("PermissionSaved", "@opencode-ai/schema/permission-saved", PermissionSaved),
  65. ...namespaceTypes("Plugin", "@opencode-ai/schema/plugin", Plugin),
  66. ...namespaceTypes("Project", "@opencode-ai/schema/project", Project),
  67. ...namespaceTypes("ProjectCopy", "@opencode-ai/schema/project-copy", ProjectCopy),
  68. ...namespaceTypes("PromptInput", "@opencode-ai/schema/prompt-input", PromptInput),
  69. ...namespaceTypes("Provider", "@opencode-ai/schema/provider", Provider),
  70. ...namespaceTypes("Pty", "@opencode-ai/schema/pty", Pty),
  71. ...namespaceTypes("PtyTicket", "@opencode-ai/schema/pty-ticket", PtyTicket),
  72. ...namespaceTypes("Question", "@opencode-ai/schema/question", Question),
  73. ...namespaceTypes("Reference", "@opencode-ai/schema/reference", Reference),
  74. ...namespaceTypes("Session", "@opencode-ai/schema/session", Session),
  75. ...namespaceTypes("SessionMessage", "@opencode-ai/schema/session-message", SessionMessage),
  76. ...namespaceTypes("SessionPending", "@opencode-ai/schema/session-pending", SessionPending),
  77. ...namespaceTypes("Shell", "@opencode-ai/schema/shell", Shell),
  78. ...namespaceTypes("Skill", "@opencode-ai/schema/skill", Skill),
  79. ...namespaceTypes("Vcs", "@opencode-ai/schema/vcs", Vcs),
  80. ...namespaceTypes("WebSearch", "@opencode-ai/schema/websearch", WebSearch),
  81. ...namespaceTypes("Workspace", "@opencode-ai/schema/workspace", Workspace),
  82. typeReference("Prompt", "@opencode-ai/schema/prompt", Prompt),
  83. typeReference("PromptMention", "@opencode-ai/schema/prompt", PromptMention),
  84. typeReference("FileAttachment", "@opencode-ai/schema/prompt", FileAttachment),
  85. typeReference("AgentAttachment", "@opencode-ai/schema/prompt", AgentAttachment),
  86. typeReference("AbsolutePath", "@opencode-ai/schema/schema", AbsolutePath),
  87. typeReference("PositiveInt", "@opencode-ai/schema/schema", PositiveInt),
  88. typeReference("RelativePath", "@opencode-ai/schema/schema", RelativePath),
  89. ]
  90. await Effect.runPromise(
  91. Effect.all(
  92. [
  93. write(
  94. emitPromise(promiseContract, {
  95. mutableOutputs: true,
  96. }),
  97. fileURLToPath(new URL("../src/promise/generated", import.meta.url)),
  98. ),
  99. write(
  100. emitEffectImported(effectContract, {
  101. module: "../../contract",
  102. api: "ClientApi",
  103. shapeModule: "../api/api.js",
  104. }),
  105. fileURLToPath(new URL("../src/effect/generated", import.meta.url)),
  106. ),
  107. write(
  108. emitEffectShape(effectContract, {
  109. typeReferences: effectTypeReferences,
  110. outputTypes: {
  111. "event.subscribe": {
  112. name: "OpenCodeEvent",
  113. import: 'import type { OpenCodeEvent } from "@opencode-ai/protocol/groups/event"',
  114. },
  115. },
  116. }),
  117. fileURLToPath(new URL("../src/effect/api", import.meta.url)),
  118. ),
  119. ],
  120. { concurrency: 3, discard: true },
  121. ).pipe(Effect.provide(NodeFileSystem.layer)),
  122. )
  123. function namespaceTypes(namespace: string, module: string, values: object) {
  124. return Object.entries(values).flatMap(([name, schema]) =>
  125. Schema.isSchema(schema) ? [typeReference(`${namespace}.${name}`, module, schema)] : [],
  126. )
  127. }
  128. function typeReference(name: string, module: string, schema: Schema.Top) {
  129. return {
  130. schema,
  131. name,
  132. import: `import type { ${name.split(".")[0]} } from ${JSON.stringify(module)}`,
  133. }
  134. }