Просмотр исходного кода

feat(sdk): add oagen effect emitter

opencode-agent[bot] 2 месяцев назад
Родитель
Сommit
321d257beb

Разница между файлами не показана из-за своего большого размера
+ 12 - 10
bun.lock


+ 5 - 1
packages/sdk/js/package.json

@@ -11,9 +11,11 @@
   "exports": {
     ".": "./src/index.ts",
     "./client": "./src/client.ts",
+    "./effect": "./src/effect.ts",
     "./server": "./src/server.ts",
     "./v2": "./src/v2/index.ts",
     "./v2/client": "./src/v2/client.ts",
+    "./v2/effect": "./src/v2/effect.ts",
     "./v2/gen/client": "./src/v2/gen/client/index.ts",
     "./v2/server": "./src/v2/server.ts"
   },
@@ -25,10 +27,12 @@
     "@tsconfig/node22": "catalog:",
     "@types/cross-spawn": "catalog:",
     "@types/node": "catalog:",
+    "@workos/oagen": "0.21.1",
     "@typescript/native-preview": "catalog:",
     "typescript": "catalog:"
   },
   "dependencies": {
-    "cross-spawn": "catalog:"
+    "cross-spawn": "catalog:",
+    "effect": "catalog:"
   }
 }

+ 35 - 0
packages/sdk/js/script/build.ts

@@ -8,6 +8,8 @@ import { $ } from "bun"
 import path from "path"
 
 import { createClient } from "@hey-api/openapi-ts"
+import { generateFiles, parseSpec } from "@workos/oagen"
+import { effectEmitter } from "./effect-emitter.js"
 
 const opencode = path.resolve(dir, "../../opencode")
 
@@ -58,8 +60,41 @@ if (sseTypesPatched === sseTypesSource) {
 }
 await Bun.write(sseTypesPath, sseTypesPatched)
 
+const openapi = await Bun.file("./openapi.json").json()
+const effect = generateFiles(await parseSpec("./openapi.json"), effectEmitter, {
+  namespace: "Opencode",
+  outputDir: "./src/v2/gen",
+  emitterOptions: {
+    serverSentEvents: serverSentEvents(openapi),
+  },
+})
+for (const file of effect.files) {
+  await Bun.write(path.join("./src/v2/gen", file.path), file.content)
+}
+
 await $`bun prettier --write src/gen`
 await $`bun prettier --write src/v2`
 await $`rm -rf dist`
 await $`bun tsc`
 await $`rm openapi.json`
+
+function serverSentEvents(spec: unknown) {
+  if (!spec || typeof spec !== "object" || !("paths" in spec) || !spec.paths || typeof spec.paths !== "object")
+    return []
+
+  return Object.entries(spec.paths).flatMap(([route, value]) => {
+    if (!value || typeof value !== "object") return []
+
+    return Object.entries(value).flatMap(([method, operation]) => {
+      if (!operation || typeof operation !== "object" || !("responses" in operation)) return []
+      if (!hasEventStream(operation.responses)) return []
+      return [`${method.toUpperCase()} ${route}`]
+    })
+  })
+}
+
+function hasEventStream(value: unknown): boolean {
+  if (!value || typeof value !== "object") return false
+  if ("text/event-stream" in value) return true
+  return Object.values(value).some(hasEventStream)
+}

+ 209 - 0
packages/sdk/js/script/effect-emitter.ts

@@ -0,0 +1,209 @@
+import type { ApiSpec, Emitter, EmitterContext, GeneratedFile, Operation, Service } from "@workos/oagen"
+
+type EffectEmitterOptions = {
+  serverSentEvents?: string[]
+}
+
+export const effectEmitter: Emitter = {
+  language: "effect",
+
+  generateModels(): GeneratedFile[] {
+    return []
+  },
+
+  generateEnums(): GeneratedFile[] {
+    return []
+  },
+
+  generateResources(): GeneratedFile[] {
+    return []
+  },
+
+  generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {
+    return [generateEffectClient(spec, ctx)]
+  },
+
+  generateErrors(): GeneratedFile[] {
+    return []
+  },
+
+  generateTests(): GeneratedFile[] {
+    return []
+  },
+
+  fileHeader() {
+    return "// This file is auto-generated by oagen. Do not edit."
+  },
+}
+
+function generateEffectClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {
+  const sse = new Set((ctx.emitterOptions as EffectEmitterOptions | undefined)?.serverSentEvents ?? [])
+  const operations = spec.services.flatMap((service) => service.operations.map((operation) => ({ service, operation })))
+  const typeImports = operations.flatMap(({ operation }) => {
+    const type = operationType(operation)
+    if (operation.errors.length === 0) return [`${type}Data`, `${type}Response`, `${type}Responses`]
+    return [`${type}Data`, `${type}Error`, `${type}Errors`, `${type}Response`, `${type}Responses`]
+  })
+
+  return {
+    path: "effect.gen.ts",
+    content: [
+      `import { Effect } from "effect"`,
+      `import type { Client, Options, TDataShape } from "./client/index.js"`,
+      `import type { ServerSentEventsResult } from "./core/serverSentEvents.gen.js"`,
+      `import type {`,
+      ...Array.from(new Set(typeImports))
+        .sort()
+        .map((name) => `  ${name},`),
+      `} from "./types.gen.js"`,
+      ``,
+      `export type OpencodeEffectOptions<TData extends TDataShape, TResponse> = Omit<`,
+      `  Options<TData, true, TResponse, "data">,`,
+      `  "responseStyle" | "throwOnError"`,
+      `>`,
+      ``,
+      `export interface ${ctx.namespacePascal}EffectClient {`,
+      ...spec.services.flatMap((service) => serviceShape(service, sse)),
+      `}`,
+      ``,
+      `export function create${ctx.namespacePascal}EffectClient(client: Client): ${ctx.namespacePascal}EffectClient {`,
+      `  return {`,
+      ...spec.services.flatMap((service) => serviceFactory(service, sse)),
+      `  }`,
+      `}`,
+      ``,
+      `function request<T, E>(evaluate: () => Promise<T>) {`,
+      `  return Effect.tryPromise({`,
+      `    try: evaluate,`,
+      `    catch: (error) => error as E | Error,`,
+      `  })`,
+      `}`,
+    ].join("\n"),
+  }
+}
+
+function serviceShape(service: Service, sse: Set<string>) {
+  return [
+    `  ${propertyName(service.name)}: {`,
+    ...service.operations.flatMap((operation) => [doc(operation, "    "), `    ${methodSignature(operation, sse)}`]),
+    `  }`,
+  ]
+}
+
+function serviceFactory(service: Service, sse: Set<string>) {
+  return [
+    `    ${propertyName(service.name)}: {`,
+    ...service.operations.map(
+      (operation) => `      ${propertyName(operation.name)}: ${methodFactory(operation, sse)},`,
+    ),
+    `    },`,
+  ]
+}
+
+function methodSignature(operation: Operation, sse: Set<string>) {
+  const optional = hasRequiredOptions(operation) ? "" : "?"
+  return `${propertyName(operation.name)}(options${optional}: OpencodeEffectOptions<${operationType(
+    operation,
+  )}Data, ${operationType(operation)}Responses>): Effect.Effect<${operationResponse(operation, sse)}, ${operationError(
+    operation,
+  )}>`
+}
+
+function methodFactory(operation: Operation, sse: Set<string>) {
+  const type = operationType(operation)
+  const args = [
+    `url: ${JSON.stringify(operation.path)}`,
+    `...options`,
+    `throwOnError: true`,
+    `responseStyle: "data"`,
+    contentType(operation),
+  ].filter((line): line is string => Boolean(line))
+  const request = isSse(operation, sse)
+    ? `client.sse.${operation.httpMethod}<${type}Responses, ${operationErrorTypes(operation)}, true, "data">({ ${args.join(
+        ", ",
+      )} })`
+    : `client.${operation.httpMethod}<${type}Responses, ${operationErrorTypes(operation)}, true, "data">({ ${args.join(
+        ", ",
+      )} })`
+  return `(options${hasRequiredOptions(operation) ? "" : "?"}) => request<${operationResponse(
+    operation,
+    sse,
+  )}, ${operationErrorValue(operation)}>(() => ${request})`
+}
+
+function operationResponse(operation: Operation, sse: Set<string>) {
+  const type = operationType(operation)
+  if (isSse(operation, sse)) return `ServerSentEventsResult<${type}Responses>`
+  return `${type}Response`
+}
+
+function operationError(operation: Operation) {
+  if (operation.errors.length === 0) return "Error"
+  return `${operationType(operation)}Error | Error`
+}
+
+function operationErrorValue(operation: Operation) {
+  if (operation.errors.length === 0) return "never"
+  return `${operationType(operation)}Error`
+}
+
+function operationErrorTypes(operation: Operation) {
+  if (operation.errors.length === 0) return "unknown"
+  return `${operationType(operation)}Errors`
+}
+
+function contentType(operation: Operation) {
+  if (!operation.requestBody) return
+  const value = {
+    binary: "application/octet-stream",
+    json: "application/json",
+    text: "text/plain",
+    "form-urlencoded": "application/x-www-form-urlencoded",
+    "form-data": undefined,
+  }[operation.requestBodyEncoding ?? "json"]
+  if (!value) return
+  return `headers: { "Content-Type": ${JSON.stringify(value)}, ...options?.headers }`
+}
+
+function hasRequiredOptions(operation: Operation) {
+  return (
+    operation.pathParams.length > 0 ||
+    operation.queryParams.some((item) => item.required) ||
+    operation.headerParams.some((item) => item.required)
+  )
+}
+
+function isSse(operation: Operation, sse: Set<string>) {
+  return sse.has(`${operation.httpMethod.toUpperCase()} ${operation.path}`)
+}
+
+function operationType(operation: Operation) {
+  return identifier(operation.name)
+}
+
+function propertyName(value: string) {
+  return value.charAt(0).toLowerCase() + value.slice(1)
+}
+
+function identifier(value: string) {
+  return value
+    .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
+    .replace(/[^A-Za-z0-9]+/g, " ")
+    .trim()
+    .split(/\s+/)
+    .filter(Boolean)
+    .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
+    .join("")
+}
+
+function doc(operation: Operation, indent: string) {
+  if (!operation.description) return `${indent}/** ${operation.httpMethod.toUpperCase()} ${operation.path} */`
+  return [
+    `${indent}/**`,
+    ...operation.description
+      .replaceAll("*/", "* /")
+      .split("\n")
+      .map((line) => `${indent} * ${line}`),
+    `${indent} */`,
+  ].join("\n")
+}

+ 1 - 0
packages/sdk/js/src/effect.ts

@@ -0,0 +1 @@
+export * from "./v2/effect.js"

+ 8 - 3
packages/sdk/js/src/v2/client.ts

@@ -4,7 +4,8 @@ import { createClient } from "./gen/client/client.gen.js"
 import { type Config } from "./gen/client/types.gen.js"
 import { OpencodeClient } from "./gen/sdk.gen.js"
 import { wrapClientError } from "../error-interceptor.js"
-export { type Config as OpencodeClientConfig, OpencodeClient }
+export { OpencodeClient }
+export type OpencodeClientConfig = Config & { directory?: string; experimental_workspaceID?: string }
 
 function pick(value: string | null, fallback?: string, encode?: (value: string) => string) {
   if (!value) return
@@ -44,7 +45,7 @@ function rewrite(request: Request, values: { directory?: string; workspace?: str
   return next
 }
 
-export function createOpencodeClient(config?: Config & { directory?: string; experimental_workspaceID?: string }) {
+export function createOpencodeFetchClient(config?: OpencodeClientConfig) {
   if (!config?.fetch) {
     const customFetch: any = (req: any) => {
       // @ts-ignore
@@ -86,5 +87,9 @@ export function createOpencodeClient(config?: Config & { directory?: string; exp
     return response
   })
   client.interceptors.error.use(wrapClientError)
-  return new OpencodeClient({ client })
+  return client
+}
+
+export function createOpencodeClient(config?: OpencodeClientConfig) {
+  return new OpencodeClient({ client: createOpencodeFetchClient(config) })
 }

+ 8 - 0
packages/sdk/js/src/v2/effect.ts

@@ -0,0 +1,8 @@
+export * from "./gen/effect.gen.js"
+
+import { createOpencodeFetchClient, type OpencodeClientConfig } from "./client.js"
+import { createOpencodeEffectClient as createGeneratedOpencodeEffectClient } from "./gen/effect.gen.js"
+
+export function createOpencodeEffectClient(config?: OpencodeClientConfig) {
+  return createGeneratedOpencodeEffectClient(createOpencodeFetchClient(config))
+}

+ 3323 - 0
packages/sdk/js/src/v2/gen/effect.gen.ts

@@ -0,0 +1,3323 @@
+// This file is auto-generated by oagen. Do not edit.
+
+import { Effect } from "effect"
+import type { Client, Options, TDataShape } from "./client/index.js"
+import type { ServerSentEventsResult } from "./core/serverSentEvents.gen.js"
+import type {
+  AppAgentsData,
+  AppAgentsError,
+  AppAgentsErrors,
+  AppAgentsResponse,
+  AppAgentsResponses,
+  AppLogData,
+  AppLogError,
+  AppLogErrors,
+  AppLogResponse,
+  AppLogResponses,
+  AppSkillsData,
+  AppSkillsError,
+  AppSkillsErrors,
+  AppSkillsResponse,
+  AppSkillsResponses,
+  AuthRemoveData,
+  AuthRemoveError,
+  AuthRemoveErrors,
+  AuthRemoveResponse,
+  AuthRemoveResponses,
+  AuthSetData,
+  AuthSetError,
+  AuthSetErrors,
+  AuthSetResponse,
+  AuthSetResponses,
+  CommandListData,
+  CommandListError,
+  CommandListErrors,
+  CommandListResponse,
+  CommandListResponses,
+  ConfigGetData,
+  ConfigGetError,
+  ConfigGetErrors,
+  ConfigGetResponse,
+  ConfigGetResponses,
+  ConfigProvidersData,
+  ConfigProvidersError,
+  ConfigProvidersErrors,
+  ConfigProvidersResponse,
+  ConfigProvidersResponses,
+  ConfigUpdateData,
+  ConfigUpdateError,
+  ConfigUpdateErrors,
+  ConfigUpdateResponse,
+  ConfigUpdateResponses,
+  EventSubscribeData,
+  EventSubscribeResponse,
+  EventSubscribeResponses,
+  ExperimentalConsoleGetData,
+  ExperimentalConsoleGetError,
+  ExperimentalConsoleGetErrors,
+  ExperimentalConsoleGetResponse,
+  ExperimentalConsoleGetResponses,
+  ExperimentalConsoleListOrgsData,
+  ExperimentalConsoleListOrgsError,
+  ExperimentalConsoleListOrgsErrors,
+  ExperimentalConsoleListOrgsResponse,
+  ExperimentalConsoleListOrgsResponses,
+  ExperimentalConsoleSwitchOrgData,
+  ExperimentalConsoleSwitchOrgResponse,
+  ExperimentalConsoleSwitchOrgResponses,
+  ExperimentalProjectCopyCreateData,
+  ExperimentalProjectCopyCreateError,
+  ExperimentalProjectCopyCreateErrors,
+  ExperimentalProjectCopyCreateResponse,
+  ExperimentalProjectCopyCreateResponses,
+  ExperimentalProjectCopyRefreshData,
+  ExperimentalProjectCopyRefreshError,
+  ExperimentalProjectCopyRefreshErrors,
+  ExperimentalProjectCopyRefreshResponse,
+  ExperimentalProjectCopyRefreshResponses,
+  ExperimentalProjectCopyRemoveData,
+  ExperimentalProjectCopyRemoveError,
+  ExperimentalProjectCopyRemoveErrors,
+  ExperimentalProjectCopyRemoveResponse,
+  ExperimentalProjectCopyRemoveResponses,
+  ExperimentalResourceListData,
+  ExperimentalResourceListError,
+  ExperimentalResourceListErrors,
+  ExperimentalResourceListResponse,
+  ExperimentalResourceListResponses,
+  ExperimentalSessionListData,
+  ExperimentalSessionListError,
+  ExperimentalSessionListErrors,
+  ExperimentalSessionListResponse,
+  ExperimentalSessionListResponses,
+  ExperimentalWorkspaceAdapterListData,
+  ExperimentalWorkspaceAdapterListError,
+  ExperimentalWorkspaceAdapterListErrors,
+  ExperimentalWorkspaceAdapterListResponse,
+  ExperimentalWorkspaceAdapterListResponses,
+  ExperimentalWorkspaceCreateData,
+  ExperimentalWorkspaceCreateError,
+  ExperimentalWorkspaceCreateErrors,
+  ExperimentalWorkspaceCreateResponse,
+  ExperimentalWorkspaceCreateResponses,
+  ExperimentalWorkspaceListData,
+  ExperimentalWorkspaceListError,
+  ExperimentalWorkspaceListErrors,
+  ExperimentalWorkspaceListResponse,
+  ExperimentalWorkspaceListResponses,
+  ExperimentalWorkspaceRemoveData,
+  ExperimentalWorkspaceRemoveError,
+  ExperimentalWorkspaceRemoveErrors,
+  ExperimentalWorkspaceRemoveResponse,
+  ExperimentalWorkspaceRemoveResponses,
+  ExperimentalWorkspaceStatusData,
+  ExperimentalWorkspaceStatusError,
+  ExperimentalWorkspaceStatusErrors,
+  ExperimentalWorkspaceStatusResponse,
+  ExperimentalWorkspaceStatusResponses,
+  ExperimentalWorkspaceSyncListData,
+  ExperimentalWorkspaceSyncListError,
+  ExperimentalWorkspaceSyncListErrors,
+  ExperimentalWorkspaceSyncListResponse,
+  ExperimentalWorkspaceSyncListResponses,
+  ExperimentalWorkspaceWarpData,
+  ExperimentalWorkspaceWarpError,
+  ExperimentalWorkspaceWarpErrors,
+  ExperimentalWorkspaceWarpResponse,
+  ExperimentalWorkspaceWarpResponses,
+  FileListData,
+  FileListError,
+  FileListErrors,
+  FileListResponse,
+  FileListResponses,
+  FileReadData,
+  FileReadError,
+  FileReadErrors,
+  FileReadResponse,
+  FileReadResponses,
+  FileStatusData,
+  FileStatusError,
+  FileStatusErrors,
+  FileStatusResponse,
+  FileStatusResponses,
+  FindFilesData,
+  FindFilesError,
+  FindFilesErrors,
+  FindFilesResponse,
+  FindFilesResponses,
+  FindSymbolsData,
+  FindSymbolsError,
+  FindSymbolsErrors,
+  FindSymbolsResponse,
+  FindSymbolsResponses,
+  FindTextData,
+  FindTextError,
+  FindTextErrors,
+  FindTextResponse,
+  FindTextResponses,
+  FormatterStatusData,
+  FormatterStatusError,
+  FormatterStatusErrors,
+  FormatterStatusResponse,
+  FormatterStatusResponses,
+  GlobalConfigGetData,
+  GlobalConfigGetError,
+  GlobalConfigGetErrors,
+  GlobalConfigGetResponse,
+  GlobalConfigGetResponses,
+  GlobalConfigUpdateData,
+  GlobalConfigUpdateError,
+  GlobalConfigUpdateErrors,
+  GlobalConfigUpdateResponse,
+  GlobalConfigUpdateResponses,
+  GlobalDisposeData,
+  GlobalDisposeError,
+  GlobalDisposeErrors,
+  GlobalDisposeResponse,
+  GlobalDisposeResponses,
+  GlobalEventData,
+  GlobalEventError,
+  GlobalEventErrors,
+  GlobalEventResponse,
+  GlobalEventResponses,
+  GlobalHealthData,
+  GlobalHealthError,
+  GlobalHealthErrors,
+  GlobalHealthResponse,
+  GlobalHealthResponses,
+  GlobalUpgradeData,
+  GlobalUpgradeError,
+  GlobalUpgradeErrors,
+  GlobalUpgradeResponse,
+  GlobalUpgradeResponses,
+  InstanceDisposeData,
+  InstanceDisposeError,
+  InstanceDisposeErrors,
+  InstanceDisposeResponse,
+  InstanceDisposeResponses,
+  LspStatusData,
+  LspStatusError,
+  LspStatusErrors,
+  LspStatusResponse,
+  LspStatusResponses,
+  McpAddData,
+  McpAddError,
+  McpAddErrors,
+  McpAddResponse,
+  McpAddResponses,
+  McpAuthAuthenticateData,
+  McpAuthAuthenticateError,
+  McpAuthAuthenticateErrors,
+  McpAuthAuthenticateResponse,
+  McpAuthAuthenticateResponses,
+  McpAuthCallbackData,
+  McpAuthCallbackError,
+  McpAuthCallbackErrors,
+  McpAuthCallbackResponse,
+  McpAuthCallbackResponses,
+  McpAuthRemoveData,
+  McpAuthRemoveError,
+  McpAuthRemoveErrors,
+  McpAuthRemoveResponse,
+  McpAuthRemoveResponses,
+  McpAuthStartData,
+  McpAuthStartError,
+  McpAuthStartErrors,
+  McpAuthStartResponse,
+  McpAuthStartResponses,
+  McpConnectData,
+  McpConnectError,
+  McpConnectErrors,
+  McpConnectResponse,
+  McpConnectResponses,
+  McpDisconnectData,
+  McpDisconnectError,
+  McpDisconnectErrors,
+  McpDisconnectResponse,
+  McpDisconnectResponses,
+  McpStatusData,
+  McpStatusError,
+  McpStatusErrors,
+  McpStatusResponse,
+  McpStatusResponses,
+  PartDeleteData,
+  PartDeleteError,
+  PartDeleteErrors,
+  PartDeleteResponse,
+  PartDeleteResponses,
+  PartUpdateData,
+  PartUpdateError,
+  PartUpdateErrors,
+  PartUpdateResponse,
+  PartUpdateResponses,
+  PathGetData,
+  PathGetError,
+  PathGetErrors,
+  PathGetResponse,
+  PathGetResponses,
+  PermissionListData,
+  PermissionListError,
+  PermissionListErrors,
+  PermissionListResponse,
+  PermissionListResponses,
+  PermissionReplyData,
+  PermissionReplyError,
+  PermissionReplyErrors,
+  PermissionReplyResponse,
+  PermissionReplyResponses,
+  PermissionRespondData,
+  PermissionRespondError,
+  PermissionRespondErrors,
+  PermissionRespondResponse,
+  PermissionRespondResponses,
+  ProjectCurrentData,
+  ProjectCurrentError,
+  ProjectCurrentErrors,
+  ProjectCurrentResponse,
+  ProjectCurrentResponses,
+  ProjectDirectoriesData,
+  ProjectDirectoriesError,
+  ProjectDirectoriesErrors,
+  ProjectDirectoriesResponse,
+  ProjectDirectoriesResponses,
+  ProjectInitGitData,
+  ProjectInitGitError,
+  ProjectInitGitErrors,
+  ProjectInitGitResponse,
+  ProjectInitGitResponses,
+  ProjectListData,
+  ProjectListError,
+  ProjectListErrors,
+  ProjectListResponse,
+  ProjectListResponses,
+  ProjectUpdateData,
+  ProjectUpdateError,
+  ProjectUpdateErrors,
+  ProjectUpdateResponse,
+  ProjectUpdateResponses,
+  ProviderAuthData,
+  ProviderAuthError,
+  ProviderAuthErrors,
+  ProviderAuthResponse,
+  ProviderAuthResponses,
+  ProviderListData,
+  ProviderListError,
+  ProviderListErrors,
+  ProviderListResponse,
+  ProviderListResponses,
+  ProviderOauthAuthorizeData,
+  ProviderOauthAuthorizeError,
+  ProviderOauthAuthorizeErrors,
+  ProviderOauthAuthorizeResponse,
+  ProviderOauthAuthorizeResponses,
+  ProviderOauthCallbackData,
+  ProviderOauthCallbackError,
+  ProviderOauthCallbackErrors,
+  ProviderOauthCallbackResponse,
+  ProviderOauthCallbackResponses,
+  PtyConnectData,
+  PtyConnectError,
+  PtyConnectErrors,
+  PtyConnectResponse,
+  PtyConnectResponses,
+  PtyConnectTokenData,
+  PtyConnectTokenError,
+  PtyConnectTokenErrors,
+  PtyConnectTokenResponse,
+  PtyConnectTokenResponses,
+  PtyCreateData,
+  PtyCreateError,
+  PtyCreateErrors,
+  PtyCreateResponse,
+  PtyCreateResponses,
+  PtyGetData,
+  PtyGetError,
+  PtyGetErrors,
+  PtyGetResponse,
+  PtyGetResponses,
+  PtyListData,
+  PtyListError,
+  PtyListErrors,
+  PtyListResponse,
+  PtyListResponses,
+  PtyRemoveData,
+  PtyRemoveError,
+  PtyRemoveErrors,
+  PtyRemoveResponse,
+  PtyRemoveResponses,
+  PtyShellsData,
+  PtyShellsError,
+  PtyShellsErrors,
+  PtyShellsResponse,
+  PtyShellsResponses,
+  PtyUpdateData,
+  PtyUpdateError,
+  PtyUpdateErrors,
+  PtyUpdateResponse,
+  PtyUpdateResponses,
+  QuestionListData,
+  QuestionListError,
+  QuestionListErrors,
+  QuestionListResponse,
+  QuestionListResponses,
+  QuestionRejectData,
+  QuestionRejectError,
+  QuestionRejectErrors,
+  QuestionRejectResponse,
+  QuestionRejectResponses,
+  QuestionReplyData,
+  QuestionReplyError,
+  QuestionReplyErrors,
+  QuestionReplyResponse,
+  QuestionReplyResponses,
+  SessionAbortData,
+  SessionAbortError,
+  SessionAbortErrors,
+  SessionAbortResponse,
+  SessionAbortResponses,
+  SessionChildrenData,
+  SessionChildrenError,
+  SessionChildrenErrors,
+  SessionChildrenResponse,
+  SessionChildrenResponses,
+  SessionCommandData,
+  SessionCommandError,
+  SessionCommandErrors,
+  SessionCommandResponse,
+  SessionCommandResponses,
+  SessionCreateData,
+  SessionCreateError,
+  SessionCreateErrors,
+  SessionCreateResponse,
+  SessionCreateResponses,
+  SessionDeleteData,
+  SessionDeleteError,
+  SessionDeleteErrors,
+  SessionDeleteMessageData,
+  SessionDeleteMessageError,
+  SessionDeleteMessageErrors,
+  SessionDeleteMessageResponse,
+  SessionDeleteMessageResponses,
+  SessionDeleteResponse,
+  SessionDeleteResponses,
+  SessionDiffData,
+  SessionDiffError,
+  SessionDiffErrors,
+  SessionDiffResponse,
+  SessionDiffResponses,
+  SessionForkData,
+  SessionForkError,
+  SessionForkErrors,
+  SessionForkResponse,
+  SessionForkResponses,
+  SessionGetData,
+  SessionGetError,
+  SessionGetErrors,
+  SessionGetResponse,
+  SessionGetResponses,
+  SessionInitData,
+  SessionInitError,
+  SessionInitErrors,
+  SessionInitResponse,
+  SessionInitResponses,
+  SessionListData,
+  SessionListError,
+  SessionListErrors,
+  SessionListResponse,
+  SessionListResponses,
+  SessionMessageData,
+  SessionMessageError,
+  SessionMessageErrors,
+  SessionMessageResponse,
+  SessionMessageResponses,
+  SessionMessagesData,
+  SessionMessagesError,
+  SessionMessagesErrors,
+  SessionMessagesResponse,
+  SessionMessagesResponses,
+  SessionPromptAsyncData,
+  SessionPromptAsyncError,
+  SessionPromptAsyncErrors,
+  SessionPromptAsyncResponse,
+  SessionPromptAsyncResponses,
+  SessionPromptData,
+  SessionPromptError,
+  SessionPromptErrors,
+  SessionPromptResponse,
+  SessionPromptResponses,
+  SessionRevertData,
+  SessionRevertError,
+  SessionRevertErrors,
+  SessionRevertResponse,
+  SessionRevertResponses,
+  SessionShareData,
+  SessionShareError,
+  SessionShareErrors,
+  SessionShareResponse,
+  SessionShareResponses,
+  SessionShellData,
+  SessionShellError,
+  SessionShellErrors,
+  SessionShellResponse,
+  SessionShellResponses,
+  SessionStatusData,
+  SessionStatusError,
+  SessionStatusErrors,
+  SessionStatusResponse,
+  SessionStatusResponses,
+  SessionSummarizeData,
+  SessionSummarizeError,
+  SessionSummarizeErrors,
+  SessionSummarizeResponse,
+  SessionSummarizeResponses,
+  SessionTodoData,
+  SessionTodoError,
+  SessionTodoErrors,
+  SessionTodoResponse,
+  SessionTodoResponses,
+  SessionUnrevertData,
+  SessionUnrevertError,
+  SessionUnrevertErrors,
+  SessionUnrevertResponse,
+  SessionUnrevertResponses,
+  SessionUnshareData,
+  SessionUnshareError,
+  SessionUnshareErrors,
+  SessionUnshareResponse,
+  SessionUnshareResponses,
+  SessionUpdateData,
+  SessionUpdateError,
+  SessionUpdateErrors,
+  SessionUpdateResponse,
+  SessionUpdateResponses,
+  SyncHistoryListData,
+  SyncHistoryListError,
+  SyncHistoryListErrors,
+  SyncHistoryListResponse,
+  SyncHistoryListResponses,
+  SyncReplayData,
+  SyncReplayError,
+  SyncReplayErrors,
+  SyncReplayResponse,
+  SyncReplayResponses,
+  SyncStartData,
+  SyncStartError,
+  SyncStartErrors,
+  SyncStartResponse,
+  SyncStartResponses,
+  SyncStealData,
+  SyncStealError,
+  SyncStealErrors,
+  SyncStealResponse,
+  SyncStealResponses,
+  ToolIdsData,
+  ToolIdsError,
+  ToolIdsErrors,
+  ToolIdsResponse,
+  ToolIdsResponses,
+  ToolListData,
+  ToolListError,
+  ToolListErrors,
+  ToolListResponse,
+  ToolListResponses,
+  TuiAppendPromptData,
+  TuiAppendPromptError,
+  TuiAppendPromptErrors,
+  TuiAppendPromptResponse,
+  TuiAppendPromptResponses,
+  TuiClearPromptData,
+  TuiClearPromptError,
+  TuiClearPromptErrors,
+  TuiClearPromptResponse,
+  TuiClearPromptResponses,
+  TuiControlNextData,
+  TuiControlNextError,
+  TuiControlNextErrors,
+  TuiControlNextResponse,
+  TuiControlNextResponses,
+  TuiControlResponseData,
+  TuiControlResponseError,
+  TuiControlResponseErrors,
+  TuiControlResponseResponse,
+  TuiControlResponseResponses,
+  TuiExecuteCommandData,
+  TuiExecuteCommandError,
+  TuiExecuteCommandErrors,
+  TuiExecuteCommandResponse,
+  TuiExecuteCommandResponses,
+  TuiOpenHelpData,
+  TuiOpenHelpError,
+  TuiOpenHelpErrors,
+  TuiOpenHelpResponse,
+  TuiOpenHelpResponses,
+  TuiOpenModelsData,
+  TuiOpenModelsError,
+  TuiOpenModelsErrors,
+  TuiOpenModelsResponse,
+  TuiOpenModelsResponses,
+  TuiOpenSessionsData,
+  TuiOpenSessionsError,
+  TuiOpenSessionsErrors,
+  TuiOpenSessionsResponse,
+  TuiOpenSessionsResponses,
+  TuiOpenThemesData,
+  TuiOpenThemesError,
+  TuiOpenThemesErrors,
+  TuiOpenThemesResponse,
+  TuiOpenThemesResponses,
+  TuiPublishData,
+  TuiPublishError,
+  TuiPublishErrors,
+  TuiPublishResponse,
+  TuiPublishResponses,
+  TuiSelectSessionData,
+  TuiSelectSessionError,
+  TuiSelectSessionErrors,
+  TuiSelectSessionResponse,
+  TuiSelectSessionResponses,
+  TuiShowToastData,
+  TuiShowToastError,
+  TuiShowToastErrors,
+  TuiShowToastResponse,
+  TuiShowToastResponses,
+  TuiSubmitPromptData,
+  TuiSubmitPromptError,
+  TuiSubmitPromptErrors,
+  TuiSubmitPromptResponse,
+  TuiSubmitPromptResponses,
+  V2FsListData,
+  V2FsListError,
+  V2FsListErrors,
+  V2FsListResponse,
+  V2FsListResponses,
+  V2FsReadData,
+  V2FsReadError,
+  V2FsReadErrors,
+  V2FsReadResponse,
+  V2FsReadResponses,
+  V2ModelListData,
+  V2ModelListError,
+  V2ModelListErrors,
+  V2ModelListResponse,
+  V2ModelListResponses,
+  V2PermissionRequestListData,
+  V2PermissionRequestListError,
+  V2PermissionRequestListErrors,
+  V2PermissionRequestListResponse,
+  V2PermissionRequestListResponses,
+  V2PermissionSavedListData,
+  V2PermissionSavedListError,
+  V2PermissionSavedListErrors,
+  V2PermissionSavedListResponse,
+  V2PermissionSavedListResponses,
+  V2PermissionSavedRemoveData,
+  V2PermissionSavedRemoveError,
+  V2PermissionSavedRemoveErrors,
+  V2PermissionSavedRemoveResponse,
+  V2PermissionSavedRemoveResponses,
+  V2ProviderGetData,
+  V2ProviderGetError,
+  V2ProviderGetErrors,
+  V2ProviderGetResponse,
+  V2ProviderGetResponses,
+  V2ProviderListData,
+  V2ProviderListError,
+  V2ProviderListErrors,
+  V2ProviderListResponse,
+  V2ProviderListResponses,
+  V2SessionCompactData,
+  V2SessionCompactError,
+  V2SessionCompactErrors,
+  V2SessionCompactResponse,
+  V2SessionCompactResponses,
+  V2SessionContextData,
+  V2SessionContextError,
+  V2SessionContextErrors,
+  V2SessionContextResponse,
+  V2SessionContextResponses,
+  V2SessionListData,
+  V2SessionListError,
+  V2SessionListErrors,
+  V2SessionListResponse,
+  V2SessionListResponses,
+  V2SessionMessagesData,
+  V2SessionMessagesError,
+  V2SessionMessagesErrors,
+  V2SessionMessagesResponse,
+  V2SessionMessagesResponses,
+  V2SessionPermissionListData,
+  V2SessionPermissionListError,
+  V2SessionPermissionListErrors,
+  V2SessionPermissionListResponse,
+  V2SessionPermissionListResponses,
+  V2SessionPermissionReplyData,
+  V2SessionPermissionReplyError,
+  V2SessionPermissionReplyErrors,
+  V2SessionPermissionReplyResponse,
+  V2SessionPermissionReplyResponses,
+  V2SessionPromptData,
+  V2SessionPromptError,
+  V2SessionPromptErrors,
+  V2SessionPromptResponse,
+  V2SessionPromptResponses,
+  V2SessionWaitData,
+  V2SessionWaitError,
+  V2SessionWaitErrors,
+  V2SessionWaitResponse,
+  V2SessionWaitResponses,
+  VcsApplyData,
+  VcsApplyError,
+  VcsApplyErrors,
+  VcsApplyResponse,
+  VcsApplyResponses,
+  VcsDiffData,
+  VcsDiffError,
+  VcsDiffErrors,
+  VcsDiffRawData,
+  VcsDiffRawError,
+  VcsDiffRawErrors,
+  VcsDiffRawResponse,
+  VcsDiffRawResponses,
+  VcsDiffResponse,
+  VcsDiffResponses,
+  VcsGetData,
+  VcsGetError,
+  VcsGetErrors,
+  VcsGetResponse,
+  VcsGetResponses,
+  VcsStatusData,
+  VcsStatusError,
+  VcsStatusErrors,
+  VcsStatusResponse,
+  VcsStatusResponses,
+  WorktreeCreateData,
+  WorktreeCreateError,
+  WorktreeCreateErrors,
+  WorktreeCreateResponse,
+  WorktreeCreateResponses,
+  WorktreeListData,
+  WorktreeListError,
+  WorktreeListErrors,
+  WorktreeListResponse,
+  WorktreeListResponses,
+  WorktreeRemoveData,
+  WorktreeRemoveError,
+  WorktreeRemoveErrors,
+  WorktreeRemoveResponse,
+  WorktreeRemoveResponses,
+  WorktreeResetData,
+  WorktreeResetError,
+  WorktreeResetErrors,
+  WorktreeResetResponse,
+  WorktreeResetResponses,
+} from "./types.gen.js"
+
+export type OpencodeEffectOptions<TData extends TDataShape, TResponse> = Omit<
+  Options<TData, true, TResponse, "data">,
+  "responseStyle" | "throwOnError"
+>
+
+export interface OpencodeEffectClient {
+  global: {
+    /**
+     * Get health
+     *
+     * Get health information about the OpenCode server.
+     */
+    globalHealth(
+      options?: OpencodeEffectOptions<GlobalHealthData, GlobalHealthResponses>,
+    ): Effect.Effect<GlobalHealthResponse, GlobalHealthError | Error>
+    /**
+     * Get global events
+     *
+     * Subscribe to global events from the OpenCode system using server-sent events.
+     */
+    globalEvent(
+      options?: OpencodeEffectOptions<GlobalEventData, GlobalEventResponses>,
+    ): Effect.Effect<ServerSentEventsResult<GlobalEventResponses>, GlobalEventError | Error>
+    /**
+     * Get global configuration
+     *
+     * Retrieve the current global OpenCode configuration settings and preferences.
+     */
+    globalConfigGet(
+      options?: OpencodeEffectOptions<GlobalConfigGetData, GlobalConfigGetResponses>,
+    ): Effect.Effect<GlobalConfigGetResponse, GlobalConfigGetError | Error>
+    /**
+     * Update global configuration
+     *
+     * Update global OpenCode configuration settings and preferences.
+     */
+    globalConfigUpdate(
+      options?: OpencodeEffectOptions<GlobalConfigUpdateData, GlobalConfigUpdateResponses>,
+    ): Effect.Effect<GlobalConfigUpdateResponse, GlobalConfigUpdateError | Error>
+    /**
+     * Dispose instance
+     *
+     * Clean up and dispose all OpenCode instances, releasing all resources.
+     */
+    globalDispose(
+      options?: OpencodeEffectOptions<GlobalDisposeData, GlobalDisposeResponses>,
+    ): Effect.Effect<GlobalDisposeResponse, GlobalDisposeError | Error>
+    /**
+     * Upgrade opencode
+     *
+     * Upgrade opencode to the specified version or latest if not specified.
+     */
+    globalUpgrade(
+      options?: OpencodeEffectOptions<GlobalUpgradeData, GlobalUpgradeResponses>,
+    ): Effect.Effect<GlobalUpgradeResponse, GlobalUpgradeError | Error>
+  }
+  event: {
+    /**
+     * Subscribe to events
+     *
+     * Get events
+     */
+    eventSubscribe(
+      options?: OpencodeEffectOptions<EventSubscribeData, EventSubscribeResponses>,
+    ): Effect.Effect<ServerSentEventsResult<EventSubscribeResponses>, Error>
+  }
+  config: {
+    /**
+     * Get configuration
+     *
+     * Retrieve the current OpenCode configuration settings and preferences.
+     */
+    configGet(
+      options?: OpencodeEffectOptions<ConfigGetData, ConfigGetResponses>,
+    ): Effect.Effect<ConfigGetResponse, ConfigGetError | Error>
+    /**
+     * Update configuration
+     *
+     * Update OpenCode configuration settings and preferences.
+     */
+    configUpdate(
+      options?: OpencodeEffectOptions<ConfigUpdateData, ConfigUpdateResponses>,
+    ): Effect.Effect<ConfigUpdateResponse, ConfigUpdateError | Error>
+    /**
+     * List config providers
+     *
+     * Get a list of all configured AI providers and their default models.
+     */
+    configProviders(
+      options?: OpencodeEffectOptions<ConfigProvidersData, ConfigProvidersResponses>,
+    ): Effect.Effect<ConfigProvidersResponse, ConfigProvidersError | Error>
+  }
+  experimental: {
+    /**
+     * Get active Console provider metadata
+     *
+     * Get the active Console org name and the set of provider IDs managed by that Console org.
+     */
+    experimentalConsoleGet(
+      options?: OpencodeEffectOptions<ExperimentalConsoleGetData, ExperimentalConsoleGetResponses>,
+    ): Effect.Effect<ExperimentalConsoleGetResponse, ExperimentalConsoleGetError | Error>
+    /**
+     * List switchable Console orgs
+     *
+     * Get the available Console orgs across logged-in accounts, including the current active org.
+     */
+    experimentalConsoleListOrgs(
+      options?: OpencodeEffectOptions<ExperimentalConsoleListOrgsData, ExperimentalConsoleListOrgsResponses>,
+    ): Effect.Effect<ExperimentalConsoleListOrgsResponse, ExperimentalConsoleListOrgsError | Error>
+    /**
+     * Switch active Console org
+     *
+     * Persist a new active Console account/org selection for the current local OpenCode state.
+     */
+    experimentalConsoleSwitchOrg(
+      options?: OpencodeEffectOptions<ExperimentalConsoleSwitchOrgData, ExperimentalConsoleSwitchOrgResponses>,
+    ): Effect.Effect<ExperimentalConsoleSwitchOrgResponse, Error>
+    /**
+     * List tools
+     *
+     * Get a list of available tools with their JSON schema parameters for a specific provider and model combination.
+     */
+    toolList(
+      options: OpencodeEffectOptions<ToolListData, ToolListResponses>,
+    ): Effect.Effect<ToolListResponse, ToolListError | Error>
+    /**
+     * List tool IDs
+     *
+     * Get a list of all available tool IDs, including both built-in tools and dynamically registered tools.
+     */
+    toolIds(
+      options?: OpencodeEffectOptions<ToolIdsData, ToolIdsResponses>,
+    ): Effect.Effect<ToolIdsResponse, ToolIdsError | Error>
+    /**
+     * List worktrees
+     *
+     * List all sandbox worktrees for the current project.
+     */
+    worktreeList(
+      options?: OpencodeEffectOptions<WorktreeListData, WorktreeListResponses>,
+    ): Effect.Effect<WorktreeListResponse, WorktreeListError | Error>
+    /**
+     * Create worktree
+     *
+     * Create a new git worktree for the current project and run any configured startup scripts.
+     */
+    worktreeCreate(
+      options?: OpencodeEffectOptions<WorktreeCreateData, WorktreeCreateResponses>,
+    ): Effect.Effect<WorktreeCreateResponse, WorktreeCreateError | Error>
+    /**
+     * Remove worktree
+     *
+     * Remove a git worktree and delete its branch.
+     */
+    worktreeRemove(
+      options?: OpencodeEffectOptions<WorktreeRemoveData, WorktreeRemoveResponses>,
+    ): Effect.Effect<WorktreeRemoveResponse, WorktreeRemoveError | Error>
+    /**
+     * Reset worktree
+     *
+     * Reset a worktree branch to the primary default branch.
+     */
+    worktreeReset(
+      options?: OpencodeEffectOptions<WorktreeResetData, WorktreeResetResponses>,
+    ): Effect.Effect<WorktreeResetResponse, WorktreeResetError | Error>
+    /**
+     * List sessions
+     *
+     * Get a list of all OpenCode sessions across projects, sorted by most recently updated. Archived sessions are excluded by default.
+     */
+    experimentalSessionList(
+      options?: OpencodeEffectOptions<ExperimentalSessionListData, ExperimentalSessionListResponses>,
+    ): Effect.Effect<ExperimentalSessionListResponse, ExperimentalSessionListError | Error>
+    /**
+     * Get MCP resources
+     *
+     * Get all available MCP resources from connected servers. Optionally filter by name.
+     */
+    experimentalResourceList(
+      options?: OpencodeEffectOptions<ExperimentalResourceListData, ExperimentalResourceListResponses>,
+    ): Effect.Effect<ExperimentalResourceListResponse, ExperimentalResourceListError | Error>
+  }
+  mcp: {
+    /**
+     * Get MCP status
+     *
+     * Get the status of all Model Context Protocol (MCP) servers.
+     */
+    mcpStatus(
+      options?: OpencodeEffectOptions<McpStatusData, McpStatusResponses>,
+    ): Effect.Effect<McpStatusResponse, McpStatusError | Error>
+    /**
+     * Add MCP server
+     *
+     * Dynamically add a new Model Context Protocol (MCP) server to the system.
+     */
+    mcpAdd(
+      options?: OpencodeEffectOptions<McpAddData, McpAddResponses>,
+    ): Effect.Effect<McpAddResponse, McpAddError | Error>
+    /**
+     * Start MCP OAuth
+     *
+     * Start OAuth authentication flow for a Model Context Protocol (MCP) server.
+     */
+    mcpAuthStart(
+      options: OpencodeEffectOptions<McpAuthStartData, McpAuthStartResponses>,
+    ): Effect.Effect<McpAuthStartResponse, McpAuthStartError | Error>
+    /**
+     * Remove MCP OAuth
+     *
+     * Remove OAuth credentials for an MCP server.
+     */
+    mcpAuthRemove(
+      options: OpencodeEffectOptions<McpAuthRemoveData, McpAuthRemoveResponses>,
+    ): Effect.Effect<McpAuthRemoveResponse, McpAuthRemoveError | Error>
+    /**
+     * Complete MCP OAuth
+     *
+     * Complete OAuth authentication for a Model Context Protocol (MCP) server using the authorization code.
+     */
+    mcpAuthCallback(
+      options: OpencodeEffectOptions<McpAuthCallbackData, McpAuthCallbackResponses>,
+    ): Effect.Effect<McpAuthCallbackResponse, McpAuthCallbackError | Error>
+    /**
+     * Authenticate MCP OAuth
+     *
+     * Start OAuth flow and wait for callback (opens browser).
+     */
+    mcpAuthAuthenticate(
+      options: OpencodeEffectOptions<McpAuthAuthenticateData, McpAuthAuthenticateResponses>,
+    ): Effect.Effect<McpAuthAuthenticateResponse, McpAuthAuthenticateError | Error>
+    /**
+     * Connect an MCP server.
+     */
+    mcpConnect(
+      options: OpencodeEffectOptions<McpConnectData, McpConnectResponses>,
+    ): Effect.Effect<McpConnectResponse, McpConnectError | Error>
+    /**
+     * Disconnect an MCP server.
+     */
+    mcpDisconnect(
+      options: OpencodeEffectOptions<McpDisconnectData, McpDisconnectResponses>,
+    ): Effect.Effect<McpDisconnectResponse, McpDisconnectError | Error>
+  }
+  project: {
+    /**
+     * List all projects
+     *
+     * Get a list of projects that have been opened with OpenCode.
+     */
+    projectList(
+      options?: OpencodeEffectOptions<ProjectListData, ProjectListResponses>,
+    ): Effect.Effect<ProjectListResponse, ProjectListError | Error>
+    /**
+     * Get current project
+     *
+     * Retrieve the currently active project that OpenCode is working with.
+     */
+    projectCurrent(
+      options?: OpencodeEffectOptions<ProjectCurrentData, ProjectCurrentResponses>,
+    ): Effect.Effect<ProjectCurrentResponse, ProjectCurrentError | Error>
+    /**
+     * Initialize git repository
+     *
+     * Create a git repository for the current project and return the refreshed project info.
+     */
+    projectInitGit(
+      options?: OpencodeEffectOptions<ProjectInitGitData, ProjectInitGitResponses>,
+    ): Effect.Effect<ProjectInitGitResponse, ProjectInitGitError | Error>
+    /**
+     * Update project
+     *
+     * Update project properties such as name, icon, and commands.
+     */
+    projectUpdate(
+      options: OpencodeEffectOptions<ProjectUpdateData, ProjectUpdateResponses>,
+    ): Effect.Effect<ProjectUpdateResponse, ProjectUpdateError | Error>
+    /**
+     * List project directories
+     *
+     * List known local absolute directories for a project.
+     */
+    projectDirectories(
+      options: OpencodeEffectOptions<ProjectDirectoriesData, ProjectDirectoriesResponses>,
+    ): Effect.Effect<ProjectDirectoriesResponse, ProjectDirectoriesError | Error>
+  }
+  projectCopy: {
+    /**
+     * Create project copy
+     *
+     * Create a local physical copy of a project using the selected strategy.
+     */
+    experimentalProjectCopyCreate(
+      options: OpencodeEffectOptions<ExperimentalProjectCopyCreateData, ExperimentalProjectCopyCreateResponses>,
+    ): Effect.Effect<ExperimentalProjectCopyCreateResponse, ExperimentalProjectCopyCreateError | Error>
+    /**
+     * Remove project copy
+     *
+     * Remove a local physical copy of a project using the selected strategy.
+     */
+    experimentalProjectCopyRemove(
+      options: OpencodeEffectOptions<ExperimentalProjectCopyRemoveData, ExperimentalProjectCopyRemoveResponses>,
+    ): Effect.Effect<ExperimentalProjectCopyRemoveResponse, ExperimentalProjectCopyRemoveError | Error>
+    /**
+     * Refresh project copies
+     *
+     * Discover local project copies using one or all configured strategies.
+     */
+    experimentalProjectCopyRefresh(
+      options: OpencodeEffectOptions<ExperimentalProjectCopyRefreshData, ExperimentalProjectCopyRefreshResponses>,
+    ): Effect.Effect<ExperimentalProjectCopyRefreshResponse, ExperimentalProjectCopyRefreshError | Error>
+  }
+  pty: {
+    /**
+     * List available shells
+     *
+     * Get a list of available shells on the system.
+     */
+    ptyShells(
+      options?: OpencodeEffectOptions<PtyShellsData, PtyShellsResponses>,
+    ): Effect.Effect<PtyShellsResponse, PtyShellsError | Error>
+    /**
+     * List PTY sessions
+     *
+     * Get a list of all active pseudo-terminal (PTY) sessions managed by OpenCode.
+     */
+    ptyList(
+      options?: OpencodeEffectOptions<PtyListData, PtyListResponses>,
+    ): Effect.Effect<PtyListResponse, PtyListError | Error>
+    /**
+     * Create PTY session
+     *
+     * Create a new pseudo-terminal (PTY) session for running shell commands and processes.
+     */
+    ptyCreate(
+      options?: OpencodeEffectOptions<PtyCreateData, PtyCreateResponses>,
+    ): Effect.Effect<PtyCreateResponse, PtyCreateError | Error>
+    /**
+     * Get PTY session
+     *
+     * Retrieve detailed information about a specific pseudo-terminal (PTY) session.
+     */
+    ptyGet(
+      options: OpencodeEffectOptions<PtyGetData, PtyGetResponses>,
+    ): Effect.Effect<PtyGetResponse, PtyGetError | Error>
+    /**
+     * Update PTY session
+     *
+     * Update properties of an existing pseudo-terminal (PTY) session.
+     */
+    ptyUpdate(
+      options: OpencodeEffectOptions<PtyUpdateData, PtyUpdateResponses>,
+    ): Effect.Effect<PtyUpdateResponse, PtyUpdateError | Error>
+    /**
+     * Remove PTY session
+     *
+     * Remove and terminate a specific pseudo-terminal (PTY) session.
+     */
+    ptyRemove(
+      options: OpencodeEffectOptions<PtyRemoveData, PtyRemoveResponses>,
+    ): Effect.Effect<PtyRemoveResponse, PtyRemoveError | Error>
+    /**
+     * Create PTY WebSocket token
+     *
+     * Create a short-lived ticket for opening a PTY WebSocket connection.
+     */
+    ptyConnectToken(
+      options: OpencodeEffectOptions<PtyConnectTokenData, PtyConnectTokenResponses>,
+    ): Effect.Effect<PtyConnectTokenResponse, PtyConnectTokenError | Error>
+    /**
+     * Connect to PTY session
+     *
+     * Establish a WebSocket connection to interact with a pseudo-terminal (PTY) session in real-time.
+     */
+    ptyConnect(
+      options: OpencodeEffectOptions<PtyConnectData, PtyConnectResponses>,
+    ): Effect.Effect<PtyConnectResponse, PtyConnectError | Error>
+  }
+  question: {
+    /**
+     * List pending questions
+     *
+     * Get all pending question requests across all sessions.
+     */
+    questionList(
+      options?: OpencodeEffectOptions<QuestionListData, QuestionListResponses>,
+    ): Effect.Effect<QuestionListResponse, QuestionListError | Error>
+    /**
+     * Reply to question request
+     *
+     * Provide answers to a question request from the AI assistant.
+     */
+    questionReply(
+      options: OpencodeEffectOptions<QuestionReplyData, QuestionReplyResponses>,
+    ): Effect.Effect<QuestionReplyResponse, QuestionReplyError | Error>
+    /**
+     * Reject question request
+     *
+     * Reject a question request from the AI assistant.
+     */
+    questionReject(
+      options: OpencodeEffectOptions<QuestionRejectData, QuestionRejectResponses>,
+    ): Effect.Effect<QuestionRejectResponse, QuestionRejectError | Error>
+  }
+  permission: {
+    /**
+     * List pending permissions
+     *
+     * Get all pending permission requests across all sessions.
+     */
+    permissionList(
+      options?: OpencodeEffectOptions<PermissionListData, PermissionListResponses>,
+    ): Effect.Effect<PermissionListResponse, PermissionListError | Error>
+    /**
+     * Respond to permission request
+     *
+     * Approve or deny a permission request from the AI assistant.
+     */
+    permissionReply(
+      options: OpencodeEffectOptions<PermissionReplyData, PermissionReplyResponses>,
+    ): Effect.Effect<PermissionReplyResponse, PermissionReplyError | Error>
+  }
+  provider: {
+    /**
+     * List providers
+     *
+     * Get a list of all available AI providers, including both available and connected ones.
+     */
+    providerList(
+      options?: OpencodeEffectOptions<ProviderListData, ProviderListResponses>,
+    ): Effect.Effect<ProviderListResponse, ProviderListError | Error>
+    /**
+     * Get provider auth methods
+     *
+     * Retrieve available authentication methods for all AI providers.
+     */
+    providerAuth(
+      options?: OpencodeEffectOptions<ProviderAuthData, ProviderAuthResponses>,
+    ): Effect.Effect<ProviderAuthResponse, ProviderAuthError | Error>
+    /**
+     * Start OAuth authorization
+     *
+     * Start the OAuth authorization flow for a provider.
+     */
+    providerOAuthAuthorize(
+      options: OpencodeEffectOptions<ProviderOauthAuthorizeData, ProviderOauthAuthorizeResponses>,
+    ): Effect.Effect<ProviderOauthAuthorizeResponse, ProviderOauthAuthorizeError | Error>
+    /**
+     * Handle OAuth callback
+     *
+     * Handle the OAuth callback from a provider after user authorization.
+     */
+    providerOAuthCallback(
+      options: OpencodeEffectOptions<ProviderOauthCallbackData, ProviderOauthCallbackResponses>,
+    ): Effect.Effect<ProviderOauthCallbackResponse, ProviderOauthCallbackError | Error>
+  }
+  session: {
+    /**
+     * List sessions
+     *
+     * Get a list of all OpenCode sessions, sorted by most recently updated.
+     */
+    sessionList(
+      options?: OpencodeEffectOptions<SessionListData, SessionListResponses>,
+    ): Effect.Effect<SessionListResponse, SessionListError | Error>
+    /**
+     * Create session
+     *
+     * Create a new OpenCode session for interacting with AI assistants and managing conversations.
+     */
+    sessionCreate(
+      options?: OpencodeEffectOptions<SessionCreateData, SessionCreateResponses>,
+    ): Effect.Effect<SessionCreateResponse, SessionCreateError | Error>
+    /**
+     * Get session status
+     *
+     * Retrieve the current status of all sessions, including active, idle, and completed states.
+     */
+    sessionStatus(
+      options?: OpencodeEffectOptions<SessionStatusData, SessionStatusResponses>,
+    ): Effect.Effect<SessionStatusResponse, SessionStatusError | Error>
+    /**
+     * Get session
+     *
+     * Retrieve detailed information about a specific OpenCode session.
+     */
+    sessionGet(
+      options: OpencodeEffectOptions<SessionGetData, SessionGetResponses>,
+    ): Effect.Effect<SessionGetResponse, SessionGetError | Error>
+    /**
+     * Update session
+     *
+     * Update properties of an existing session, such as title or other metadata.
+     */
+    sessionUpdate(
+      options: OpencodeEffectOptions<SessionUpdateData, SessionUpdateResponses>,
+    ): Effect.Effect<SessionUpdateResponse, SessionUpdateError | Error>
+    /**
+     * Delete session
+     *
+     * Delete a session and permanently remove all associated data, including messages and history.
+     */
+    sessionDelete(
+      options: OpencodeEffectOptions<SessionDeleteData, SessionDeleteResponses>,
+    ): Effect.Effect<SessionDeleteResponse, SessionDeleteError | Error>
+    /**
+     * Get session children
+     *
+     * Retrieve all child sessions that were forked from the specified parent session.
+     */
+    sessionChildren(
+      options: OpencodeEffectOptions<SessionChildrenData, SessionChildrenResponses>,
+    ): Effect.Effect<SessionChildrenResponse, SessionChildrenError | Error>
+    /**
+     * Get session todos
+     *
+     * Retrieve the todo list associated with a specific session, showing tasks and action items.
+     */
+    sessionTodo(
+      options: OpencodeEffectOptions<SessionTodoData, SessionTodoResponses>,
+    ): Effect.Effect<SessionTodoResponse, SessionTodoError | Error>
+    /**
+     * Get message diff
+     *
+     * Get the file changes (diff) that resulted from a specific user message in the session.
+     */
+    sessionDiff(
+      options: OpencodeEffectOptions<SessionDiffData, SessionDiffResponses>,
+    ): Effect.Effect<SessionDiffResponse, SessionDiffError | Error>
+    /**
+     * Get session messages
+     *
+     * Retrieve all messages in a session, including user prompts and AI responses.
+     */
+    sessionMessages(
+      options: OpencodeEffectOptions<SessionMessagesData, SessionMessagesResponses>,
+    ): Effect.Effect<SessionMessagesResponse, SessionMessagesError | Error>
+    /**
+     * Send message
+     *
+     * Create and send a new message to a session, streaming the AI response.
+     */
+    sessionPrompt(
+      options: OpencodeEffectOptions<SessionPromptData, SessionPromptResponses>,
+    ): Effect.Effect<SessionPromptResponse, SessionPromptError | Error>
+    /**
+     * Get message
+     *
+     * Retrieve a specific message from a session by its message ID.
+     */
+    sessionMessage(
+      options: OpencodeEffectOptions<SessionMessageData, SessionMessageResponses>,
+    ): Effect.Effect<SessionMessageResponse, SessionMessageError | Error>
+    /**
+     * Delete message
+     *
+     * Permanently delete a specific message and all of its parts from a session without reverting file changes.
+     */
+    sessionDeleteMessage(
+      options: OpencodeEffectOptions<SessionDeleteMessageData, SessionDeleteMessageResponses>,
+    ): Effect.Effect<SessionDeleteMessageResponse, SessionDeleteMessageError | Error>
+    /**
+     * Fork session
+     *
+     * Create a new session by forking an existing session at a specific message point.
+     */
+    sessionFork(
+      options: OpencodeEffectOptions<SessionForkData, SessionForkResponses>,
+    ): Effect.Effect<SessionForkResponse, SessionForkError | Error>
+    /**
+     * Abort session
+     *
+     * Abort an active session and stop any ongoing AI processing or command execution.
+     */
+    sessionAbort(
+      options: OpencodeEffectOptions<SessionAbortData, SessionAbortResponses>,
+    ): Effect.Effect<SessionAbortResponse, SessionAbortError | Error>
+    /**
+     * Initialize session
+     *
+     * Analyze the current application and create an AGENTS.md file with project-specific agent configurations.
+     */
+    sessionInit(
+      options: OpencodeEffectOptions<SessionInitData, SessionInitResponses>,
+    ): Effect.Effect<SessionInitResponse, SessionInitError | Error>
+    /**
+     * Share session
+     *
+     * Create a shareable link for a session, allowing others to view the conversation.
+     */
+    sessionShare(
+      options: OpencodeEffectOptions<SessionShareData, SessionShareResponses>,
+    ): Effect.Effect<SessionShareResponse, SessionShareError | Error>
+    /**
+     * Unshare session
+     *
+     * Remove the shareable link for a session, making it private again.
+     */
+    sessionUnshare(
+      options: OpencodeEffectOptions<SessionUnshareData, SessionUnshareResponses>,
+    ): Effect.Effect<SessionUnshareResponse, SessionUnshareError | Error>
+    /**
+     * Summarize session
+     *
+     * Generate a concise summary of the session using AI compaction to preserve key information.
+     */
+    sessionSummarize(
+      options: OpencodeEffectOptions<SessionSummarizeData, SessionSummarizeResponses>,
+    ): Effect.Effect<SessionSummarizeResponse, SessionSummarizeError | Error>
+    /**
+     * Send async message
+     *
+     * Create and send a new message to a session asynchronously, starting the session if needed and returning immediately.
+     */
+    sessionPromptAsync(
+      options: OpencodeEffectOptions<SessionPromptAsyncData, SessionPromptAsyncResponses>,
+    ): Effect.Effect<SessionPromptAsyncResponse, SessionPromptAsyncError | Error>
+    /**
+     * Send command
+     *
+     * Send a new command to a session for execution by the AI assistant.
+     */
+    sessionCommand(
+      options: OpencodeEffectOptions<SessionCommandData, SessionCommandResponses>,
+    ): Effect.Effect<SessionCommandResponse, SessionCommandError | Error>
+    /**
+     * Run shell command
+     *
+     * Execute a shell command within the session context and return the AI's response.
+     */
+    sessionShell(
+      options: OpencodeEffectOptions<SessionShellData, SessionShellResponses>,
+    ): Effect.Effect<SessionShellResponse, SessionShellError | Error>
+    /**
+     * Revert message
+     *
+     * Revert a specific message in a session, undoing its effects and restoring the previous state.
+     */
+    sessionRevert(
+      options: OpencodeEffectOptions<SessionRevertData, SessionRevertResponses>,
+    ): Effect.Effect<SessionRevertResponse, SessionRevertError | Error>
+    /**
+     * Restore reverted messages
+     *
+     * Restore all previously reverted messages in a session.
+     */
+    sessionUnrevert(
+      options: OpencodeEffectOptions<SessionUnrevertData, SessionUnrevertResponses>,
+    ): Effect.Effect<SessionUnrevertResponse, SessionUnrevertError | Error>
+    /**
+     * Respond to permission
+     *
+     * Approve or deny a permission request from the AI assistant.
+     */
+    permissionRespond(
+      options: OpencodeEffectOptions<PermissionRespondData, PermissionRespondResponses>,
+    ): Effect.Effect<PermissionRespondResponse, PermissionRespondError | Error>
+    /**
+     * Update a part in a message.
+     */
+    partUpdate(
+      options: OpencodeEffectOptions<PartUpdateData, PartUpdateResponses>,
+    ): Effect.Effect<PartUpdateResponse, PartUpdateError | Error>
+    /**
+     * Delete a part from a message.
+     */
+    partDelete(
+      options: OpencodeEffectOptions<PartDeleteData, PartDeleteResponses>,
+    ): Effect.Effect<PartDeleteResponse, PartDeleteError | Error>
+  }
+  sync: {
+    /**
+     * Start workspace sync
+     *
+     * Start sync loops for workspaces in the current project that have active sessions.
+     */
+    syncStart(
+      options?: OpencodeEffectOptions<SyncStartData, SyncStartResponses>,
+    ): Effect.Effect<SyncStartResponse, SyncStartError | Error>
+    /**
+     * Replay sync events
+     *
+     * Validate and replay a complete sync event history.
+     */
+    syncReplay(
+      options?: OpencodeEffectOptions<SyncReplayData, SyncReplayResponses>,
+    ): Effect.Effect<SyncReplayResponse, SyncReplayError | Error>
+    /**
+     * Steal session into workspace
+     *
+     * Update a session to belong to the current workspace through the sync event system.
+     */
+    syncSteal(
+      options?: OpencodeEffectOptions<SyncStealData, SyncStealResponses>,
+    ): Effect.Effect<SyncStealResponse, SyncStealError | Error>
+    /**
+     * List sync events
+     *
+     * List sync events for all aggregates. Keys are aggregate IDs the client already knows about, values are the last known sequence ID. Events with seq > value are returned for those aggregates. Aggregates not listed in the input get their full history.
+     */
+    syncHistoryList(
+      options?: OpencodeEffectOptions<SyncHistoryListData, SyncHistoryListResponses>,
+    ): Effect.Effect<SyncHistoryListResponse, SyncHistoryListError | Error>
+  }
+  v2: {
+    /**
+     * List v2 sessions
+     *
+     * Retrieve sessions in the requested order. Items keep that order across pages; use cursor.next or cursor.previous to move through the ordered list.
+     */
+    v2SessionList(
+      options?: OpencodeEffectOptions<V2SessionListData, V2SessionListResponses>,
+    ): Effect.Effect<V2SessionListResponse, V2SessionListError | Error>
+    /**
+     * Send v2 message
+     *
+     * Create a v2 session message and queue it for the agent loop.
+     */
+    v2SessionPrompt(
+      options: OpencodeEffectOptions<V2SessionPromptData, V2SessionPromptResponses>,
+    ): Effect.Effect<V2SessionPromptResponse, V2SessionPromptError | Error>
+    /**
+     * Compact v2 session
+     *
+     * Compact a v2 session conversation.
+     */
+    v2SessionCompact(
+      options: OpencodeEffectOptions<V2SessionCompactData, V2SessionCompactResponses>,
+    ): Effect.Effect<V2SessionCompactResponse, V2SessionCompactError | Error>
+    /**
+     * Wait for v2 session
+     *
+     * Wait for a v2 session agent loop to become idle.
+     */
+    v2SessionWait(
+      options: OpencodeEffectOptions<V2SessionWaitData, V2SessionWaitResponses>,
+    ): Effect.Effect<V2SessionWaitResponse, V2SessionWaitError | Error>
+    /**
+     * Get v2 session context
+     *
+     * Retrieve the active context messages for a v2 session (all messages after the last compaction).
+     */
+    v2SessionContext(
+      options: OpencodeEffectOptions<V2SessionContextData, V2SessionContextResponses>,
+    ): Effect.Effect<V2SessionContextResponse, V2SessionContextError | Error>
+  }
+  v2Messages: {
+    /**
+     * Get v2 session messages
+     *
+     * Retrieve projected v2 messages for a session. Items keep the requested order across pages; use cursor.next or cursor.previous to move through the ordered timeline.
+     */
+    v2SessionMessages(
+      options: OpencodeEffectOptions<V2SessionMessagesData, V2SessionMessagesResponses>,
+    ): Effect.Effect<V2SessionMessagesResponse, V2SessionMessagesError | Error>
+  }
+  v2Models: {
+    /**
+     * List v2 models
+     *
+     * Retrieve available v2 models ordered by release date.
+     */
+    v2ModelList(
+      options?: OpencodeEffectOptions<V2ModelListData, V2ModelListResponses>,
+    ): Effect.Effect<V2ModelListResponse, V2ModelListError | Error>
+  }
+  v2Providers: {
+    /**
+     * List v2 providers
+     *
+     * Retrieve active v2 AI providers so clients can show provider availability and configuration.
+     */
+    v2ProviderList(
+      options?: OpencodeEffectOptions<V2ProviderListData, V2ProviderListResponses>,
+    ): Effect.Effect<V2ProviderListResponse, V2ProviderListError | Error>
+    /**
+     * Get v2 provider
+     *
+     * Retrieve a single v2 AI provider so clients can inspect its availability and endpoint settings.
+     */
+    v2ProviderGet(
+      options: OpencodeEffectOptions<V2ProviderGetData, V2ProviderGetResponses>,
+    ): Effect.Effect<V2ProviderGetResponse, V2ProviderGetError | Error>
+  }
+  v2Permissions: {
+    /**
+     * List pending permission requests
+     *
+     * Retrieve pending permission requests for a location.
+     */
+    v2PermissionRequestList(
+      options?: OpencodeEffectOptions<V2PermissionRequestListData, V2PermissionRequestListResponses>,
+    ): Effect.Effect<V2PermissionRequestListResponse, V2PermissionRequestListError | Error>
+  }
+  v2SessionPermissions: {
+    /**
+     * List session permission requests
+     *
+     * Retrieve pending permission requests owned by a session.
+     */
+    v2SessionPermissionList(
+      options: OpencodeEffectOptions<V2SessionPermissionListData, V2SessionPermissionListResponses>,
+    ): Effect.Effect<V2SessionPermissionListResponse, V2SessionPermissionListError | Error>
+    /**
+     * Reply to pending permission request
+     *
+     * Respond to a pending permission request owned by a session.
+     */
+    v2SessionPermissionReply(
+      options: OpencodeEffectOptions<V2SessionPermissionReplyData, V2SessionPermissionReplyResponses>,
+    ): Effect.Effect<V2SessionPermissionReplyResponse, V2SessionPermissionReplyError | Error>
+  }
+  v2SavedPermissions: {
+    /**
+     * List saved permissions
+     *
+     * Retrieve saved permissions, optionally filtered by project.
+     */
+    v2PermissionSavedList(
+      options?: OpencodeEffectOptions<V2PermissionSavedListData, V2PermissionSavedListResponses>,
+    ): Effect.Effect<V2PermissionSavedListResponse, V2PermissionSavedListError | Error>
+    /**
+     * Remove saved permission
+     *
+     * Remove a saved permission by ID.
+     */
+    v2PermissionSavedRemove(
+      options: OpencodeEffectOptions<V2PermissionSavedRemoveData, V2PermissionSavedRemoveResponses>,
+    ): Effect.Effect<V2PermissionSavedRemoveResponse, V2PermissionSavedRemoveError | Error>
+  }
+  v2Filesystem: {
+    /**
+     * Read file
+     *
+     * Read one file relative to the requested location.
+     */
+    v2FsRead(
+      options: OpencodeEffectOptions<V2FsReadData, V2FsReadResponses>,
+    ): Effect.Effect<V2FsReadResponse, V2FsReadError | Error>
+    /**
+     * List directory
+     *
+     * List direct children of one directory relative to the requested location.
+     */
+    v2FsList(
+      options?: OpencodeEffectOptions<V2FsListData, V2FsListResponses>,
+    ): Effect.Effect<V2FsListResponse, V2FsListError | Error>
+  }
+  tui: {
+    /**
+     * Append TUI prompt
+     *
+     * Append prompt to the TUI.
+     */
+    tuiAppendPrompt(
+      options?: OpencodeEffectOptions<TuiAppendPromptData, TuiAppendPromptResponses>,
+    ): Effect.Effect<TuiAppendPromptResponse, TuiAppendPromptError | Error>
+    /**
+     * Open help dialog
+     *
+     * Open the help dialog in the TUI to display user assistance information.
+     */
+    tuiOpenHelp(
+      options?: OpencodeEffectOptions<TuiOpenHelpData, TuiOpenHelpResponses>,
+    ): Effect.Effect<TuiOpenHelpResponse, TuiOpenHelpError | Error>
+    /**
+     * Open sessions dialog
+     *
+     * Open the session dialog.
+     */
+    tuiOpenSessions(
+      options?: OpencodeEffectOptions<TuiOpenSessionsData, TuiOpenSessionsResponses>,
+    ): Effect.Effect<TuiOpenSessionsResponse, TuiOpenSessionsError | Error>
+    /**
+     * Open themes dialog
+     *
+     * Open the theme dialog.
+     */
+    tuiOpenThemes(
+      options?: OpencodeEffectOptions<TuiOpenThemesData, TuiOpenThemesResponses>,
+    ): Effect.Effect<TuiOpenThemesResponse, TuiOpenThemesError | Error>
+    /**
+     * Open models dialog
+     *
+     * Open the model dialog.
+     */
+    tuiOpenModels(
+      options?: OpencodeEffectOptions<TuiOpenModelsData, TuiOpenModelsResponses>,
+    ): Effect.Effect<TuiOpenModelsResponse, TuiOpenModelsError | Error>
+    /**
+     * Submit TUI prompt
+     *
+     * Submit the prompt.
+     */
+    tuiSubmitPrompt(
+      options?: OpencodeEffectOptions<TuiSubmitPromptData, TuiSubmitPromptResponses>,
+    ): Effect.Effect<TuiSubmitPromptResponse, TuiSubmitPromptError | Error>
+    /**
+     * Clear TUI prompt
+     *
+     * Clear the prompt.
+     */
+    tuiClearPrompt(
+      options?: OpencodeEffectOptions<TuiClearPromptData, TuiClearPromptResponses>,
+    ): Effect.Effect<TuiClearPromptResponse, TuiClearPromptError | Error>
+    /**
+     * Execute TUI command
+     *
+     * Execute a TUI command.
+     */
+    tuiExecuteCommand(
+      options?: OpencodeEffectOptions<TuiExecuteCommandData, TuiExecuteCommandResponses>,
+    ): Effect.Effect<TuiExecuteCommandResponse, TuiExecuteCommandError | Error>
+    /**
+     * Show TUI toast
+     *
+     * Show a toast notification in the TUI.
+     */
+    tuiShowToast(
+      options?: OpencodeEffectOptions<TuiShowToastData, TuiShowToastResponses>,
+    ): Effect.Effect<TuiShowToastResponse, TuiShowToastError | Error>
+    /**
+     * Publish TUI event
+     *
+     * Publish a TUI event.
+     */
+    tuiPublish(
+      options?: OpencodeEffectOptions<TuiPublishData, TuiPublishResponses>,
+    ): Effect.Effect<TuiPublishResponse, TuiPublishError | Error>
+    /**
+     * Select session
+     *
+     * Navigate the TUI to display the specified session.
+     */
+    tuiSelectSession(
+      options?: OpencodeEffectOptions<TuiSelectSessionData, TuiSelectSessionResponses>,
+    ): Effect.Effect<TuiSelectSessionResponse, TuiSelectSessionError | Error>
+    /**
+     * Get next TUI request
+     *
+     * Retrieve the next TUI request from the queue for processing.
+     */
+    tuiControlNext(
+      options?: OpencodeEffectOptions<TuiControlNextData, TuiControlNextResponses>,
+    ): Effect.Effect<TuiControlNextResponse, TuiControlNextError | Error>
+    /**
+     * Submit TUI response
+     *
+     * Submit a response to the TUI request queue to complete a pending request.
+     */
+    tuiControlResponse(
+      options?: OpencodeEffectOptions<TuiControlResponseData, TuiControlResponseResponses>,
+    ): Effect.Effect<TuiControlResponseResponse, TuiControlResponseError | Error>
+  }
+  workspace: {
+    /**
+     * List workspace adapters
+     *
+     * List all available workspace adapters for the current project.
+     */
+    experimentalWorkspaceAdapterList(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceAdapterListData, ExperimentalWorkspaceAdapterListResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceAdapterListResponse, ExperimentalWorkspaceAdapterListError | Error>
+    /**
+     * List workspaces
+     *
+     * List all workspaces.
+     */
+    experimentalWorkspaceList(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceListData, ExperimentalWorkspaceListResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceListResponse, ExperimentalWorkspaceListError | Error>
+    /**
+     * Create workspace
+     *
+     * Create a workspace for the current project.
+     */
+    experimentalWorkspaceCreate(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceCreateData, ExperimentalWorkspaceCreateResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceCreateResponse, ExperimentalWorkspaceCreateError | Error>
+    /**
+     * Sync workspace list
+     *
+     * Register missing workspaces returned by workspace adapters.
+     */
+    experimentalWorkspaceSyncList(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceSyncListData, ExperimentalWorkspaceSyncListResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceSyncListResponse, ExperimentalWorkspaceSyncListError | Error>
+    /**
+     * Workspace status
+     *
+     * Get connection status for workspaces in the current project.
+     */
+    experimentalWorkspaceStatus(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceStatusData, ExperimentalWorkspaceStatusResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceStatusResponse, ExperimentalWorkspaceStatusError | Error>
+    /**
+     * Remove workspace
+     *
+     * Remove an existing workspace.
+     */
+    experimentalWorkspaceRemove(
+      options: OpencodeEffectOptions<ExperimentalWorkspaceRemoveData, ExperimentalWorkspaceRemoveResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceRemoveResponse, ExperimentalWorkspaceRemoveError | Error>
+    /**
+     * Warp session into workspace
+     *
+     * Move a session's sync history into the target workspace, or detach it to the local project.
+     */
+    experimentalWorkspaceWarp(
+      options?: OpencodeEffectOptions<ExperimentalWorkspaceWarpData, ExperimentalWorkspaceWarpResponses>,
+    ): Effect.Effect<ExperimentalWorkspaceWarpResponse, ExperimentalWorkspaceWarpError | Error>
+  }
+  auth: {
+    /**
+     * Set auth credentials
+     *
+     * Set authentication credentials
+     */
+    authSet(
+      options: OpencodeEffectOptions<AuthSetData, AuthSetResponses>,
+    ): Effect.Effect<AuthSetResponse, AuthSetError | Error>
+    /**
+     * Remove auth credentials
+     *
+     * Remove authentication credentials
+     */
+    authRemove(
+      options: OpencodeEffectOptions<AuthRemoveData, AuthRemoveResponses>,
+    ): Effect.Effect<AuthRemoveResponse, AuthRemoveError | Error>
+  }
+  log: {
+    /**
+     * Write log
+     *
+     * Write a log entry to the server logs with specified level and metadata.
+     */
+    appLog(
+      options?: OpencodeEffectOptions<AppLogData, AppLogResponses>,
+    ): Effect.Effect<AppLogResponse, AppLogError | Error>
+  }
+  find: {
+    /**
+     * Find text
+     *
+     * Search for text patterns across files in the project using ripgrep.
+     */
+    findText(
+      options: OpencodeEffectOptions<FindTextData, FindTextResponses>,
+    ): Effect.Effect<FindTextResponse, FindTextError | Error>
+    /**
+     * Find files
+     *
+     * Search for files or directories by name or pattern in the project directory.
+     */
+    findFiles(
+      options: OpencodeEffectOptions<FindFilesData, FindFilesResponses>,
+    ): Effect.Effect<FindFilesResponse, FindFilesError | Error>
+    /**
+     * Find symbols
+     *
+     * Search for workspace symbols like functions, classes, and variables using LSP.
+     */
+    findSymbols(
+      options: OpencodeEffectOptions<FindSymbolsData, FindSymbolsResponses>,
+    ): Effect.Effect<FindSymbolsResponse, FindSymbolsError | Error>
+  }
+  file: {
+    /**
+     * List files
+     *
+     * List files and directories in a specified path.
+     */
+    fileList(
+      options: OpencodeEffectOptions<FileListData, FileListResponses>,
+    ): Effect.Effect<FileListResponse, FileListError | Error>
+    /**
+     * Read file
+     *
+     * Read the content of a specified file.
+     */
+    fileRead(
+      options: OpencodeEffectOptions<FileReadData, FileReadResponses>,
+    ): Effect.Effect<FileReadResponse, FileReadError | Error>
+    /**
+     * Get file status
+     *
+     * Get the git status of all files in the project.
+     */
+    fileStatus(
+      options?: OpencodeEffectOptions<FileStatusData, FileStatusResponses>,
+    ): Effect.Effect<FileStatusResponse, FileStatusError | Error>
+  }
+  instance: {
+    /**
+     * Dispose instance
+     *
+     * Clean up and dispose the current OpenCode instance, releasing all resources.
+     */
+    instanceDispose(
+      options?: OpencodeEffectOptions<InstanceDisposeData, InstanceDisposeResponses>,
+    ): Effect.Effect<InstanceDisposeResponse, InstanceDisposeError | Error>
+  }
+  path: {
+    /**
+     * Get paths
+     *
+     * Retrieve the current working directory and related path information for the OpenCode instance.
+     */
+    pathGet(
+      options?: OpencodeEffectOptions<PathGetData, PathGetResponses>,
+    ): Effect.Effect<PathGetResponse, PathGetError | Error>
+  }
+  vcs: {
+    /**
+     * Get VCS info
+     *
+     * Retrieve version control system (VCS) information for the current project, such as git branch.
+     */
+    vcsGet(
+      options?: OpencodeEffectOptions<VcsGetData, VcsGetResponses>,
+    ): Effect.Effect<VcsGetResponse, VcsGetError | Error>
+    /**
+     * Get VCS status
+     *
+     * Retrieve changed files in the current working tree without patches.
+     */
+    vcsStatus(
+      options?: OpencodeEffectOptions<VcsStatusData, VcsStatusResponses>,
+    ): Effect.Effect<VcsStatusResponse, VcsStatusError | Error>
+    /**
+     * Get VCS diff
+     *
+     * Retrieve the current git diff for the working tree or against the default branch.
+     */
+    vcsDiff(
+      options: OpencodeEffectOptions<VcsDiffData, VcsDiffResponses>,
+    ): Effect.Effect<VcsDiffResponse, VcsDiffError | Error>
+    /**
+     * Get raw VCS diff
+     *
+     * Retrieve a raw patch for current uncommitted changes.
+     */
+    vcsDiffRaw(
+      options?: OpencodeEffectOptions<VcsDiffRawData, VcsDiffRawResponses>,
+    ): Effect.Effect<VcsDiffRawResponse, VcsDiffRawError | Error>
+    /**
+     * Apply VCS patch
+     *
+     * Apply a raw patch to the current working tree.
+     */
+    vcsApply(
+      options?: OpencodeEffectOptions<VcsApplyData, VcsApplyResponses>,
+    ): Effect.Effect<VcsApplyResponse, VcsApplyError | Error>
+  }
+  command: {
+    /**
+     * List commands
+     *
+     * Get a list of all available commands in the OpenCode system.
+     */
+    commandList(
+      options?: OpencodeEffectOptions<CommandListData, CommandListResponses>,
+    ): Effect.Effect<CommandListResponse, CommandListError | Error>
+  }
+  agent: {
+    /**
+     * List agents
+     *
+     * Get a list of all available AI agents in the OpenCode system.
+     */
+    appAgents(
+      options?: OpencodeEffectOptions<AppAgentsData, AppAgentsResponses>,
+    ): Effect.Effect<AppAgentsResponse, AppAgentsError | Error>
+  }
+  skill: {
+    /**
+     * List skills
+     *
+     * Get a list of all available skills in the OpenCode system.
+     */
+    appSkills(
+      options?: OpencodeEffectOptions<AppSkillsData, AppSkillsResponses>,
+    ): Effect.Effect<AppSkillsResponse, AppSkillsError | Error>
+  }
+  lsp: {
+    /**
+     * Get LSP status
+     *
+     * Get LSP server status
+     */
+    lspStatus(
+      options?: OpencodeEffectOptions<LspStatusData, LspStatusResponses>,
+    ): Effect.Effect<LspStatusResponse, LspStatusError | Error>
+  }
+  formatter: {
+    /**
+     * Get formatter status
+     */
+    formatterStatus(
+      options?: OpencodeEffectOptions<FormatterStatusData, FormatterStatusResponses>,
+    ): Effect.Effect<FormatterStatusResponse, FormatterStatusError | Error>
+  }
+}
+
+export function createOpencodeEffectClient(client: Client): OpencodeEffectClient {
+  return {
+    global: {
+      globalHealth: (options?) =>
+        request<GlobalHealthResponse, GlobalHealthError>(() =>
+          client.get<GlobalHealthResponses, GlobalHealthErrors, true, "data">({
+            url: "/global/health",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      globalEvent: (options?) =>
+        request<ServerSentEventsResult<GlobalEventResponses>, GlobalEventError>(() =>
+          client.sse.get<GlobalEventResponses, GlobalEventErrors, true, "data">({
+            url: "/global/event",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      globalConfigGet: (options?) =>
+        request<GlobalConfigGetResponse, GlobalConfigGetError>(() =>
+          client.get<GlobalConfigGetResponses, GlobalConfigGetErrors, true, "data">({
+            url: "/global/config",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      globalConfigUpdate: (options?) =>
+        request<GlobalConfigUpdateResponse, GlobalConfigUpdateError>(() =>
+          client.patch<GlobalConfigUpdateResponses, GlobalConfigUpdateErrors, true, "data">({
+            url: "/global/config",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      globalDispose: (options?) =>
+        request<GlobalDisposeResponse, GlobalDisposeError>(() =>
+          client.post<GlobalDisposeResponses, GlobalDisposeErrors, true, "data">({
+            url: "/global/dispose",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      globalUpgrade: (options?) =>
+        request<GlobalUpgradeResponse, GlobalUpgradeError>(() =>
+          client.post<GlobalUpgradeResponses, GlobalUpgradeErrors, true, "data">({
+            url: "/global/upgrade",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    event: {
+      eventSubscribe: (options?) =>
+        request<ServerSentEventsResult<EventSubscribeResponses>, never>(() =>
+          client.sse.get<EventSubscribeResponses, unknown, true, "data">({
+            url: "/event",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    config: {
+      configGet: (options?) =>
+        request<ConfigGetResponse, ConfigGetError>(() =>
+          client.get<ConfigGetResponses, ConfigGetErrors, true, "data">({
+            url: "/config",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      configUpdate: (options?) =>
+        request<ConfigUpdateResponse, ConfigUpdateError>(() =>
+          client.patch<ConfigUpdateResponses, ConfigUpdateErrors, true, "data">({
+            url: "/config",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      configProviders: (options?) =>
+        request<ConfigProvidersResponse, ConfigProvidersError>(() =>
+          client.get<ConfigProvidersResponses, ConfigProvidersErrors, true, "data">({
+            url: "/config/providers",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    experimental: {
+      experimentalConsoleGet: (options?) =>
+        request<ExperimentalConsoleGetResponse, ExperimentalConsoleGetError>(() =>
+          client.get<ExperimentalConsoleGetResponses, ExperimentalConsoleGetErrors, true, "data">({
+            url: "/experimental/console",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalConsoleListOrgs: (options?) =>
+        request<ExperimentalConsoleListOrgsResponse, ExperimentalConsoleListOrgsError>(() =>
+          client.get<ExperimentalConsoleListOrgsResponses, ExperimentalConsoleListOrgsErrors, true, "data">({
+            url: "/experimental/console/orgs",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalConsoleSwitchOrg: (options?) =>
+        request<ExperimentalConsoleSwitchOrgResponse, never>(() =>
+          client.post<ExperimentalConsoleSwitchOrgResponses, unknown, true, "data">({
+            url: "/experimental/console/switch",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      toolList: (options) =>
+        request<ToolListResponse, ToolListError>(() =>
+          client.get<ToolListResponses, ToolListErrors, true, "data">({
+            url: "/experimental/tool",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      toolIds: (options?) =>
+        request<ToolIdsResponse, ToolIdsError>(() =>
+          client.get<ToolIdsResponses, ToolIdsErrors, true, "data">({
+            url: "/experimental/tool/ids",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      worktreeList: (options?) =>
+        request<WorktreeListResponse, WorktreeListError>(() =>
+          client.get<WorktreeListResponses, WorktreeListErrors, true, "data">({
+            url: "/experimental/worktree",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      worktreeCreate: (options?) =>
+        request<WorktreeCreateResponse, WorktreeCreateError>(() =>
+          client.post<WorktreeCreateResponses, WorktreeCreateErrors, true, "data">({
+            url: "/experimental/worktree",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      worktreeRemove: (options?) =>
+        request<WorktreeRemoveResponse, WorktreeRemoveError>(() =>
+          client.delete<WorktreeRemoveResponses, WorktreeRemoveErrors, true, "data">({
+            url: "/experimental/worktree",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      worktreeReset: (options?) =>
+        request<WorktreeResetResponse, WorktreeResetError>(() =>
+          client.post<WorktreeResetResponses, WorktreeResetErrors, true, "data">({
+            url: "/experimental/worktree/reset",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      experimentalSessionList: (options?) =>
+        request<ExperimentalSessionListResponse, ExperimentalSessionListError>(() =>
+          client.get<ExperimentalSessionListResponses, ExperimentalSessionListErrors, true, "data">({
+            url: "/experimental/session",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalResourceList: (options?) =>
+        request<ExperimentalResourceListResponse, ExperimentalResourceListError>(() =>
+          client.get<ExperimentalResourceListResponses, ExperimentalResourceListErrors, true, "data">({
+            url: "/experimental/resource",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    mcp: {
+      mcpStatus: (options?) =>
+        request<McpStatusResponse, McpStatusError>(() =>
+          client.get<McpStatusResponses, McpStatusErrors, true, "data">({
+            url: "/mcp",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      mcpAdd: (options?) =>
+        request<McpAddResponse, McpAddError>(() =>
+          client.post<McpAddResponses, McpAddErrors, true, "data">({
+            url: "/mcp",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      mcpAuthStart: (options) =>
+        request<McpAuthStartResponse, McpAuthStartError>(() =>
+          client.post<McpAuthStartResponses, McpAuthStartErrors, true, "data">({
+            url: "/mcp/{name}/auth",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      mcpAuthRemove: (options) =>
+        request<McpAuthRemoveResponse, McpAuthRemoveError>(() =>
+          client.delete<McpAuthRemoveResponses, McpAuthRemoveErrors, true, "data">({
+            url: "/mcp/{name}/auth",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      mcpAuthCallback: (options) =>
+        request<McpAuthCallbackResponse, McpAuthCallbackError>(() =>
+          client.post<McpAuthCallbackResponses, McpAuthCallbackErrors, true, "data">({
+            url: "/mcp/{name}/auth/callback",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      mcpAuthAuthenticate: (options) =>
+        request<McpAuthAuthenticateResponse, McpAuthAuthenticateError>(() =>
+          client.post<McpAuthAuthenticateResponses, McpAuthAuthenticateErrors, true, "data">({
+            url: "/mcp/{name}/auth/authenticate",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      mcpConnect: (options) =>
+        request<McpConnectResponse, McpConnectError>(() =>
+          client.post<McpConnectResponses, McpConnectErrors, true, "data">({
+            url: "/mcp/{name}/connect",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      mcpDisconnect: (options) =>
+        request<McpDisconnectResponse, McpDisconnectError>(() =>
+          client.post<McpDisconnectResponses, McpDisconnectErrors, true, "data">({
+            url: "/mcp/{name}/disconnect",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    project: {
+      projectList: (options?) =>
+        request<ProjectListResponse, ProjectListError>(() =>
+          client.get<ProjectListResponses, ProjectListErrors, true, "data">({
+            url: "/project",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      projectCurrent: (options?) =>
+        request<ProjectCurrentResponse, ProjectCurrentError>(() =>
+          client.get<ProjectCurrentResponses, ProjectCurrentErrors, true, "data">({
+            url: "/project/current",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      projectInitGit: (options?) =>
+        request<ProjectInitGitResponse, ProjectInitGitError>(() =>
+          client.post<ProjectInitGitResponses, ProjectInitGitErrors, true, "data">({
+            url: "/project/git/init",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      projectUpdate: (options) =>
+        request<ProjectUpdateResponse, ProjectUpdateError>(() =>
+          client.patch<ProjectUpdateResponses, ProjectUpdateErrors, true, "data">({
+            url: "/project/{projectID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      projectDirectories: (options) =>
+        request<ProjectDirectoriesResponse, ProjectDirectoriesError>(() =>
+          client.get<ProjectDirectoriesResponses, ProjectDirectoriesErrors, true, "data">({
+            url: "/project/{projectID}/directories",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    projectCopy: {
+      experimentalProjectCopyCreate: (options) =>
+        request<ExperimentalProjectCopyCreateResponse, ExperimentalProjectCopyCreateError>(() =>
+          client.post<ExperimentalProjectCopyCreateResponses, ExperimentalProjectCopyCreateErrors, true, "data">({
+            url: "/experimental/project/{projectID}/copy",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      experimentalProjectCopyRemove: (options) =>
+        request<ExperimentalProjectCopyRemoveResponse, ExperimentalProjectCopyRemoveError>(() =>
+          client.delete<ExperimentalProjectCopyRemoveResponses, ExperimentalProjectCopyRemoveErrors, true, "data">({
+            url: "/experimental/project/{projectID}/copy",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      experimentalProjectCopyRefresh: (options) =>
+        request<ExperimentalProjectCopyRefreshResponse, ExperimentalProjectCopyRefreshError>(() =>
+          client.post<ExperimentalProjectCopyRefreshResponses, ExperimentalProjectCopyRefreshErrors, true, "data">({
+            url: "/experimental/project/{projectID}/copy/refresh",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    pty: {
+      ptyShells: (options?) =>
+        request<PtyShellsResponse, PtyShellsError>(() =>
+          client.get<PtyShellsResponses, PtyShellsErrors, true, "data">({
+            url: "/pty/shells",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      ptyList: (options?) =>
+        request<PtyListResponse, PtyListError>(() =>
+          client.get<PtyListResponses, PtyListErrors, true, "data">({
+            url: "/pty",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      ptyCreate: (options?) =>
+        request<PtyCreateResponse, PtyCreateError>(() =>
+          client.post<PtyCreateResponses, PtyCreateErrors, true, "data">({
+            url: "/pty",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      ptyGet: (options) =>
+        request<PtyGetResponse, PtyGetError>(() =>
+          client.get<PtyGetResponses, PtyGetErrors, true, "data">({
+            url: "/pty/{ptyID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      ptyUpdate: (options) =>
+        request<PtyUpdateResponse, PtyUpdateError>(() =>
+          client.put<PtyUpdateResponses, PtyUpdateErrors, true, "data">({
+            url: "/pty/{ptyID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      ptyRemove: (options) =>
+        request<PtyRemoveResponse, PtyRemoveError>(() =>
+          client.delete<PtyRemoveResponses, PtyRemoveErrors, true, "data">({
+            url: "/pty/{ptyID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      ptyConnectToken: (options) =>
+        request<PtyConnectTokenResponse, PtyConnectTokenError>(() =>
+          client.post<PtyConnectTokenResponses, PtyConnectTokenErrors, true, "data">({
+            url: "/pty/{ptyID}/connect-token",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      ptyConnect: (options) =>
+        request<PtyConnectResponse, PtyConnectError>(() =>
+          client.get<PtyConnectResponses, PtyConnectErrors, true, "data">({
+            url: "/pty/{ptyID}/connect",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    question: {
+      questionList: (options?) =>
+        request<QuestionListResponse, QuestionListError>(() =>
+          client.get<QuestionListResponses, QuestionListErrors, true, "data">({
+            url: "/question",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      questionReply: (options) =>
+        request<QuestionReplyResponse, QuestionReplyError>(() =>
+          client.post<QuestionReplyResponses, QuestionReplyErrors, true, "data">({
+            url: "/question/{requestID}/reply",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      questionReject: (options) =>
+        request<QuestionRejectResponse, QuestionRejectError>(() =>
+          client.post<QuestionRejectResponses, QuestionRejectErrors, true, "data">({
+            url: "/question/{requestID}/reject",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    permission: {
+      permissionList: (options?) =>
+        request<PermissionListResponse, PermissionListError>(() =>
+          client.get<PermissionListResponses, PermissionListErrors, true, "data">({
+            url: "/permission",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      permissionReply: (options) =>
+        request<PermissionReplyResponse, PermissionReplyError>(() =>
+          client.post<PermissionReplyResponses, PermissionReplyErrors, true, "data">({
+            url: "/permission/{requestID}/reply",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    provider: {
+      providerList: (options?) =>
+        request<ProviderListResponse, ProviderListError>(() =>
+          client.get<ProviderListResponses, ProviderListErrors, true, "data">({
+            url: "/provider",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      providerAuth: (options?) =>
+        request<ProviderAuthResponse, ProviderAuthError>(() =>
+          client.get<ProviderAuthResponses, ProviderAuthErrors, true, "data">({
+            url: "/provider/auth",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      providerOAuthAuthorize: (options) =>
+        request<ProviderOauthAuthorizeResponse, ProviderOauthAuthorizeError>(() =>
+          client.post<ProviderOauthAuthorizeResponses, ProviderOauthAuthorizeErrors, true, "data">({
+            url: "/provider/{providerID}/oauth/authorize",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      providerOAuthCallback: (options) =>
+        request<ProviderOauthCallbackResponse, ProviderOauthCallbackError>(() =>
+          client.post<ProviderOauthCallbackResponses, ProviderOauthCallbackErrors, true, "data">({
+            url: "/provider/{providerID}/oauth/callback",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    session: {
+      sessionList: (options?) =>
+        request<SessionListResponse, SessionListError>(() =>
+          client.get<SessionListResponses, SessionListErrors, true, "data">({
+            url: "/session",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionCreate: (options?) =>
+        request<SessionCreateResponse, SessionCreateError>(() =>
+          client.post<SessionCreateResponses, SessionCreateErrors, true, "data">({
+            url: "/session",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionStatus: (options?) =>
+        request<SessionStatusResponse, SessionStatusError>(() =>
+          client.get<SessionStatusResponses, SessionStatusErrors, true, "data">({
+            url: "/session/status",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionGet: (options) =>
+        request<SessionGetResponse, SessionGetError>(() =>
+          client.get<SessionGetResponses, SessionGetErrors, true, "data">({
+            url: "/session/{sessionID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionUpdate: (options) =>
+        request<SessionUpdateResponse, SessionUpdateError>(() =>
+          client.patch<SessionUpdateResponses, SessionUpdateErrors, true, "data">({
+            url: "/session/{sessionID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionDelete: (options) =>
+        request<SessionDeleteResponse, SessionDeleteError>(() =>
+          client.delete<SessionDeleteResponses, SessionDeleteErrors, true, "data">({
+            url: "/session/{sessionID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionChildren: (options) =>
+        request<SessionChildrenResponse, SessionChildrenError>(() =>
+          client.get<SessionChildrenResponses, SessionChildrenErrors, true, "data">({
+            url: "/session/{sessionID}/children",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionTodo: (options) =>
+        request<SessionTodoResponse, SessionTodoError>(() =>
+          client.get<SessionTodoResponses, SessionTodoErrors, true, "data">({
+            url: "/session/{sessionID}/todo",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionDiff: (options) =>
+        request<SessionDiffResponse, SessionDiffError>(() =>
+          client.get<SessionDiffResponses, SessionDiffErrors, true, "data">({
+            url: "/session/{sessionID}/diff",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionMessages: (options) =>
+        request<SessionMessagesResponse, SessionMessagesError>(() =>
+          client.get<SessionMessagesResponses, SessionMessagesErrors, true, "data">({
+            url: "/session/{sessionID}/message",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionPrompt: (options) =>
+        request<SessionPromptResponse, SessionPromptError>(() =>
+          client.post<SessionPromptResponses, SessionPromptErrors, true, "data">({
+            url: "/session/{sessionID}/message",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionMessage: (options) =>
+        request<SessionMessageResponse, SessionMessageError>(() =>
+          client.get<SessionMessageResponses, SessionMessageErrors, true, "data">({
+            url: "/session/{sessionID}/message/{messageID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionDeleteMessage: (options) =>
+        request<SessionDeleteMessageResponse, SessionDeleteMessageError>(() =>
+          client.delete<SessionDeleteMessageResponses, SessionDeleteMessageErrors, true, "data">({
+            url: "/session/{sessionID}/message/{messageID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionFork: (options) =>
+        request<SessionForkResponse, SessionForkError>(() =>
+          client.post<SessionForkResponses, SessionForkErrors, true, "data">({
+            url: "/session/{sessionID}/fork",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionAbort: (options) =>
+        request<SessionAbortResponse, SessionAbortError>(() =>
+          client.post<SessionAbortResponses, SessionAbortErrors, true, "data">({
+            url: "/session/{sessionID}/abort",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionInit: (options) =>
+        request<SessionInitResponse, SessionInitError>(() =>
+          client.post<SessionInitResponses, SessionInitErrors, true, "data">({
+            url: "/session/{sessionID}/init",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionShare: (options) =>
+        request<SessionShareResponse, SessionShareError>(() =>
+          client.post<SessionShareResponses, SessionShareErrors, true, "data">({
+            url: "/session/{sessionID}/share",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionUnshare: (options) =>
+        request<SessionUnshareResponse, SessionUnshareError>(() =>
+          client.delete<SessionUnshareResponses, SessionUnshareErrors, true, "data">({
+            url: "/session/{sessionID}/share",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      sessionSummarize: (options) =>
+        request<SessionSummarizeResponse, SessionSummarizeError>(() =>
+          client.post<SessionSummarizeResponses, SessionSummarizeErrors, true, "data">({
+            url: "/session/{sessionID}/summarize",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionPromptAsync: (options) =>
+        request<SessionPromptAsyncResponse, SessionPromptAsyncError>(() =>
+          client.post<SessionPromptAsyncResponses, SessionPromptAsyncErrors, true, "data">({
+            url: "/session/{sessionID}/prompt_async",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionCommand: (options) =>
+        request<SessionCommandResponse, SessionCommandError>(() =>
+          client.post<SessionCommandResponses, SessionCommandErrors, true, "data">({
+            url: "/session/{sessionID}/command",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionShell: (options) =>
+        request<SessionShellResponse, SessionShellError>(() =>
+          client.post<SessionShellResponses, SessionShellErrors, true, "data">({
+            url: "/session/{sessionID}/shell",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionRevert: (options) =>
+        request<SessionRevertResponse, SessionRevertError>(() =>
+          client.post<SessionRevertResponses, SessionRevertErrors, true, "data">({
+            url: "/session/{sessionID}/revert",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      sessionUnrevert: (options) =>
+        request<SessionUnrevertResponse, SessionUnrevertError>(() =>
+          client.post<SessionUnrevertResponses, SessionUnrevertErrors, true, "data">({
+            url: "/session/{sessionID}/unrevert",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      permissionRespond: (options) =>
+        request<PermissionRespondResponse, PermissionRespondError>(() =>
+          client.post<PermissionRespondResponses, PermissionRespondErrors, true, "data">({
+            url: "/session/{sessionID}/permissions/{permissionID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      partUpdate: (options) =>
+        request<PartUpdateResponse, PartUpdateError>(() =>
+          client.patch<PartUpdateResponses, PartUpdateErrors, true, "data">({
+            url: "/session/{sessionID}/message/{messageID}/part/{partID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      partDelete: (options) =>
+        request<PartDeleteResponse, PartDeleteError>(() =>
+          client.delete<PartDeleteResponses, PartDeleteErrors, true, "data">({
+            url: "/session/{sessionID}/message/{messageID}/part/{partID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    sync: {
+      syncStart: (options?) =>
+        request<SyncStartResponse, SyncStartError>(() =>
+          client.post<SyncStartResponses, SyncStartErrors, true, "data">({
+            url: "/sync/start",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      syncReplay: (options?) =>
+        request<SyncReplayResponse, SyncReplayError>(() =>
+          client.post<SyncReplayResponses, SyncReplayErrors, true, "data">({
+            url: "/sync/replay",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      syncSteal: (options?) =>
+        request<SyncStealResponse, SyncStealError>(() =>
+          client.post<SyncStealResponses, SyncStealErrors, true, "data">({
+            url: "/sync/steal",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      syncHistoryList: (options?) =>
+        request<SyncHistoryListResponse, SyncHistoryListError>(() =>
+          client.post<SyncHistoryListResponses, SyncHistoryListErrors, true, "data">({
+            url: "/sync/history",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    v2: {
+      v2SessionList: (options?) =>
+        request<V2SessionListResponse, V2SessionListError>(() =>
+          client.get<V2SessionListResponses, V2SessionListErrors, true, "data">({
+            url: "/api/session",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2SessionPrompt: (options) =>
+        request<V2SessionPromptResponse, V2SessionPromptError>(() =>
+          client.post<V2SessionPromptResponses, V2SessionPromptErrors, true, "data">({
+            url: "/api/session/{sessionID}/prompt",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      v2SessionCompact: (options) =>
+        request<V2SessionCompactResponse, V2SessionCompactError>(() =>
+          client.post<V2SessionCompactResponses, V2SessionCompactErrors, true, "data">({
+            url: "/api/session/{sessionID}/compact",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2SessionWait: (options) =>
+        request<V2SessionWaitResponse, V2SessionWaitError>(() =>
+          client.post<V2SessionWaitResponses, V2SessionWaitErrors, true, "data">({
+            url: "/api/session/{sessionID}/wait",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2SessionContext: (options) =>
+        request<V2SessionContextResponse, V2SessionContextError>(() =>
+          client.get<V2SessionContextResponses, V2SessionContextErrors, true, "data">({
+            url: "/api/session/{sessionID}/context",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2Messages: {
+      v2SessionMessages: (options) =>
+        request<V2SessionMessagesResponse, V2SessionMessagesError>(() =>
+          client.get<V2SessionMessagesResponses, V2SessionMessagesErrors, true, "data">({
+            url: "/api/session/{sessionID}/message",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2Models: {
+      v2ModelList: (options?) =>
+        request<V2ModelListResponse, V2ModelListError>(() =>
+          client.get<V2ModelListResponses, V2ModelListErrors, true, "data">({
+            url: "/api/model",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2Providers: {
+      v2ProviderList: (options?) =>
+        request<V2ProviderListResponse, V2ProviderListError>(() =>
+          client.get<V2ProviderListResponses, V2ProviderListErrors, true, "data">({
+            url: "/api/provider",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2ProviderGet: (options) =>
+        request<V2ProviderGetResponse, V2ProviderGetError>(() =>
+          client.get<V2ProviderGetResponses, V2ProviderGetErrors, true, "data">({
+            url: "/api/provider/{providerID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2Permissions: {
+      v2PermissionRequestList: (options?) =>
+        request<V2PermissionRequestListResponse, V2PermissionRequestListError>(() =>
+          client.get<V2PermissionRequestListResponses, V2PermissionRequestListErrors, true, "data">({
+            url: "/api/permission/request",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2SessionPermissions: {
+      v2SessionPermissionList: (options) =>
+        request<V2SessionPermissionListResponse, V2SessionPermissionListError>(() =>
+          client.get<V2SessionPermissionListResponses, V2SessionPermissionListErrors, true, "data">({
+            url: "/api/session/{sessionID}/permission/request",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2SessionPermissionReply: (options) =>
+        request<V2SessionPermissionReplyResponse, V2SessionPermissionReplyError>(() =>
+          client.post<V2SessionPermissionReplyResponses, V2SessionPermissionReplyErrors, true, "data">({
+            url: "/api/session/{sessionID}/permission/request/{requestID}/reply",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    v2SavedPermissions: {
+      v2PermissionSavedList: (options?) =>
+        request<V2PermissionSavedListResponse, V2PermissionSavedListError>(() =>
+          client.get<V2PermissionSavedListResponses, V2PermissionSavedListErrors, true, "data">({
+            url: "/api/permission/saved",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2PermissionSavedRemove: (options) =>
+        request<V2PermissionSavedRemoveResponse, V2PermissionSavedRemoveError>(() =>
+          client.delete<V2PermissionSavedRemoveResponses, V2PermissionSavedRemoveErrors, true, "data">({
+            url: "/api/permission/saved/{id}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    v2Filesystem: {
+      v2FsRead: (options) =>
+        request<V2FsReadResponse, V2FsReadError>(() =>
+          client.get<V2FsReadResponses, V2FsReadErrors, true, "data">({
+            url: "/api/fs/read",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      v2FsList: (options?) =>
+        request<V2FsListResponse, V2FsListError>(() =>
+          client.get<V2FsListResponses, V2FsListErrors, true, "data">({
+            url: "/api/fs/list",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    tui: {
+      tuiAppendPrompt: (options?) =>
+        request<TuiAppendPromptResponse, TuiAppendPromptError>(() =>
+          client.post<TuiAppendPromptResponses, TuiAppendPromptErrors, true, "data">({
+            url: "/tui/append-prompt",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      tuiOpenHelp: (options?) =>
+        request<TuiOpenHelpResponse, TuiOpenHelpError>(() =>
+          client.post<TuiOpenHelpResponses, TuiOpenHelpErrors, true, "data">({
+            url: "/tui/open-help",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiOpenSessions: (options?) =>
+        request<TuiOpenSessionsResponse, TuiOpenSessionsError>(() =>
+          client.post<TuiOpenSessionsResponses, TuiOpenSessionsErrors, true, "data">({
+            url: "/tui/open-sessions",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiOpenThemes: (options?) =>
+        request<TuiOpenThemesResponse, TuiOpenThemesError>(() =>
+          client.post<TuiOpenThemesResponses, TuiOpenThemesErrors, true, "data">({
+            url: "/tui/open-themes",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiOpenModels: (options?) =>
+        request<TuiOpenModelsResponse, TuiOpenModelsError>(() =>
+          client.post<TuiOpenModelsResponses, TuiOpenModelsErrors, true, "data">({
+            url: "/tui/open-models",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiSubmitPrompt: (options?) =>
+        request<TuiSubmitPromptResponse, TuiSubmitPromptError>(() =>
+          client.post<TuiSubmitPromptResponses, TuiSubmitPromptErrors, true, "data">({
+            url: "/tui/submit-prompt",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiClearPrompt: (options?) =>
+        request<TuiClearPromptResponse, TuiClearPromptError>(() =>
+          client.post<TuiClearPromptResponses, TuiClearPromptErrors, true, "data">({
+            url: "/tui/clear-prompt",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiExecuteCommand: (options?) =>
+        request<TuiExecuteCommandResponse, TuiExecuteCommandError>(() =>
+          client.post<TuiExecuteCommandResponses, TuiExecuteCommandErrors, true, "data">({
+            url: "/tui/execute-command",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      tuiShowToast: (options?) =>
+        request<TuiShowToastResponse, TuiShowToastError>(() =>
+          client.post<TuiShowToastResponses, TuiShowToastErrors, true, "data">({
+            url: "/tui/show-toast",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      tuiPublish: (options?) =>
+        request<TuiPublishResponse, TuiPublishError>(() =>
+          client.post<TuiPublishResponses, TuiPublishErrors, true, "data">({
+            url: "/tui/publish",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      tuiSelectSession: (options?) =>
+        request<TuiSelectSessionResponse, TuiSelectSessionError>(() =>
+          client.post<TuiSelectSessionResponses, TuiSelectSessionErrors, true, "data">({
+            url: "/tui/select-session",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      tuiControlNext: (options?) =>
+        request<TuiControlNextResponse, TuiControlNextError>(() =>
+          client.get<TuiControlNextResponses, TuiControlNextErrors, true, "data">({
+            url: "/tui/control/next",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      tuiControlResponse: (options?) =>
+        request<TuiControlResponseResponse, TuiControlResponseError>(() =>
+          client.post<TuiControlResponseResponses, TuiControlResponseErrors, true, "data">({
+            url: "/tui/control/response",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    workspace: {
+      experimentalWorkspaceAdapterList: (options?) =>
+        request<ExperimentalWorkspaceAdapterListResponse, ExperimentalWorkspaceAdapterListError>(() =>
+          client.get<ExperimentalWorkspaceAdapterListResponses, ExperimentalWorkspaceAdapterListErrors, true, "data">({
+            url: "/experimental/workspace/adapter",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalWorkspaceList: (options?) =>
+        request<ExperimentalWorkspaceListResponse, ExperimentalWorkspaceListError>(() =>
+          client.get<ExperimentalWorkspaceListResponses, ExperimentalWorkspaceListErrors, true, "data">({
+            url: "/experimental/workspace",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalWorkspaceCreate: (options?) =>
+        request<ExperimentalWorkspaceCreateResponse, ExperimentalWorkspaceCreateError>(() =>
+          client.post<ExperimentalWorkspaceCreateResponses, ExperimentalWorkspaceCreateErrors, true, "data">({
+            url: "/experimental/workspace",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      experimentalWorkspaceSyncList: (options?) =>
+        request<ExperimentalWorkspaceSyncListResponse, ExperimentalWorkspaceSyncListError>(() =>
+          client.post<ExperimentalWorkspaceSyncListResponses, ExperimentalWorkspaceSyncListErrors, true, "data">({
+            url: "/experimental/workspace/sync-list",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalWorkspaceStatus: (options?) =>
+        request<ExperimentalWorkspaceStatusResponse, ExperimentalWorkspaceStatusError>(() =>
+          client.get<ExperimentalWorkspaceStatusResponses, ExperimentalWorkspaceStatusErrors, true, "data">({
+            url: "/experimental/workspace/status",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalWorkspaceRemove: (options) =>
+        request<ExperimentalWorkspaceRemoveResponse, ExperimentalWorkspaceRemoveError>(() =>
+          client.delete<ExperimentalWorkspaceRemoveResponses, ExperimentalWorkspaceRemoveErrors, true, "data">({
+            url: "/experimental/workspace/{id}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      experimentalWorkspaceWarp: (options?) =>
+        request<ExperimentalWorkspaceWarpResponse, ExperimentalWorkspaceWarpError>(() =>
+          client.post<ExperimentalWorkspaceWarpResponses, ExperimentalWorkspaceWarpErrors, true, "data">({
+            url: "/experimental/workspace/warp",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    auth: {
+      authSet: (options) =>
+        request<AuthSetResponse, AuthSetError>(() =>
+          client.put<AuthSetResponses, AuthSetErrors, true, "data">({
+            url: "/auth/{providerID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+      authRemove: (options) =>
+        request<AuthRemoveResponse, AuthRemoveError>(() =>
+          client.delete<AuthRemoveResponses, AuthRemoveErrors, true, "data">({
+            url: "/auth/{providerID}",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    log: {
+      appLog: (options?) =>
+        request<AppLogResponse, AppLogError>(() =>
+          client.post<AppLogResponses, AppLogErrors, true, "data">({
+            url: "/log",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    find: {
+      findText: (options) =>
+        request<FindTextResponse, FindTextError>(() =>
+          client.get<FindTextResponses, FindTextErrors, true, "data">({
+            url: "/find",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      findFiles: (options) =>
+        request<FindFilesResponse, FindFilesError>(() =>
+          client.get<FindFilesResponses, FindFilesErrors, true, "data">({
+            url: "/find/file",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      findSymbols: (options) =>
+        request<FindSymbolsResponse, FindSymbolsError>(() =>
+          client.get<FindSymbolsResponses, FindSymbolsErrors, true, "data">({
+            url: "/find/symbol",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    file: {
+      fileList: (options) =>
+        request<FileListResponse, FileListError>(() =>
+          client.get<FileListResponses, FileListErrors, true, "data">({
+            url: "/file",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      fileRead: (options) =>
+        request<FileReadResponse, FileReadError>(() =>
+          client.get<FileReadResponses, FileReadErrors, true, "data">({
+            url: "/file/content",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      fileStatus: (options?) =>
+        request<FileStatusResponse, FileStatusError>(() =>
+          client.get<FileStatusResponses, FileStatusErrors, true, "data">({
+            url: "/file/status",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    instance: {
+      instanceDispose: (options?) =>
+        request<InstanceDisposeResponse, InstanceDisposeError>(() =>
+          client.post<InstanceDisposeResponses, InstanceDisposeErrors, true, "data">({
+            url: "/instance/dispose",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    path: {
+      pathGet: (options?) =>
+        request<PathGetResponse, PathGetError>(() =>
+          client.get<PathGetResponses, PathGetErrors, true, "data">({
+            url: "/path",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    vcs: {
+      vcsGet: (options?) =>
+        request<VcsGetResponse, VcsGetError>(() =>
+          client.get<VcsGetResponses, VcsGetErrors, true, "data">({
+            url: "/vcs",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      vcsStatus: (options?) =>
+        request<VcsStatusResponse, VcsStatusError>(() =>
+          client.get<VcsStatusResponses, VcsStatusErrors, true, "data">({
+            url: "/vcs/status",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      vcsDiff: (options) =>
+        request<VcsDiffResponse, VcsDiffError>(() =>
+          client.get<VcsDiffResponses, VcsDiffErrors, true, "data">({
+            url: "/vcs/diff",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      vcsDiffRaw: (options?) =>
+        request<VcsDiffRawResponse, VcsDiffRawError>(() =>
+          client.get<VcsDiffRawResponses, VcsDiffRawErrors, true, "data">({
+            url: "/vcs/diff/raw",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+      vcsApply: (options?) =>
+        request<VcsApplyResponse, VcsApplyError>(() =>
+          client.post<VcsApplyResponses, VcsApplyErrors, true, "data">({
+            url: "/vcs/apply",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+            headers: { "Content-Type": "application/json", ...options?.headers },
+          }),
+        ),
+    },
+    command: {
+      commandList: (options?) =>
+        request<CommandListResponse, CommandListError>(() =>
+          client.get<CommandListResponses, CommandListErrors, true, "data">({
+            url: "/command",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    agent: {
+      appAgents: (options?) =>
+        request<AppAgentsResponse, AppAgentsError>(() =>
+          client.get<AppAgentsResponses, AppAgentsErrors, true, "data">({
+            url: "/agent",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    skill: {
+      appSkills: (options?) =>
+        request<AppSkillsResponse, AppSkillsError>(() =>
+          client.get<AppSkillsResponses, AppSkillsErrors, true, "data">({
+            url: "/skill",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    lsp: {
+      lspStatus: (options?) =>
+        request<LspStatusResponse, LspStatusError>(() =>
+          client.get<LspStatusResponses, LspStatusErrors, true, "data">({
+            url: "/lsp",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+    formatter: {
+      formatterStatus: (options?) =>
+        request<FormatterStatusResponse, FormatterStatusError>(() =>
+          client.get<FormatterStatusResponses, FormatterStatusErrors, true, "data">({
+            url: "/formatter",
+            ...options,
+            throwOnError: true,
+            responseStyle: "data",
+          }),
+        ),
+    },
+  }
+}
+
+function request<T, E>(evaluate: () => Promise<T>) {
+  return Effect.tryPromise({
+    try: evaluate,
+    catch: (error) => error as E | Error,
+  })
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов