chore: generate

This commit is contained in:
opencode-agent[bot]
2026-04-29 13:36:05 +00:00
parent 6015084fa2
commit df147b65fd
25 changed files with 978 additions and 715 deletions
@@ -29,14 +29,18 @@ export const PtyApi = HttpApi.make("pty")
.add( .add(
HttpApiGroup.make("pty") HttpApiGroup.make("pty")
.add( .add(
HttpApiEndpoint.get("shells", PtyPaths.shells, { success: described(Schema.Array(ShellItem), "List of shells") }).annotateMerge( HttpApiEndpoint.get("shells", PtyPaths.shells, {
success: described(Schema.Array(ShellItem), "List of shells"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "pty.shells", identifier: "pty.shells",
summary: "List available shells", summary: "List available shells",
description: "Get a list of available shells on the system.", description: "Get a list of available shells on the system.",
}), }),
), ),
HttpApiEndpoint.get("list", PtyPaths.list, { success: described(Schema.Array(Pty.Info), "List of sessions") }).annotateMerge( HttpApiEndpoint.get("list", PtyPaths.list, {
success: described(Schema.Array(Pty.Info), "List of sessions"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "pty.list", identifier: "pty.list",
summary: "List PTY sessions", summary: "List PTY sessions",
@@ -11,11 +11,28 @@ export const TuiRequestPayload = Schema.Struct({
path: Schema.String, path: Schema.String,
body: Schema.Unknown, body: Schema.Unknown,
}) })
const EventTuiPromptAppend = Schema.Struct({ type: Schema.Literal(TuiEvent.PromptAppend.type), properties: TuiEvent.PromptAppend.properties }).annotate({ identifier: "EventTuiPromptAppend" }) const EventTuiPromptAppend = Schema.Struct({
const EventTuiCommandExecute = Schema.Struct({ type: Schema.Literal(TuiEvent.CommandExecute.type), properties: TuiEvent.CommandExecute.properties }).annotate({ identifier: "EventTuiCommandExecute" }) type: Schema.Literal(TuiEvent.PromptAppend.type),
const EventTuiToastShow = Schema.Struct({ type: Schema.Literal(TuiEvent.ToastShow.type), properties: TuiEvent.ToastShow.properties }).annotate({ identifier: "EventTuiToastShow" }) properties: TuiEvent.PromptAppend.properties,
const EventTuiSessionSelect = Schema.Struct({ type: Schema.Literal(TuiEvent.SessionSelect.type), properties: TuiEvent.SessionSelect.properties }).annotate({ identifier: "EventTuiSessionSelect" }) }).annotate({ identifier: "EventTuiPromptAppend" })
export const TuiPublishPayload = Schema.Union([EventTuiPromptAppend, EventTuiCommandExecute, EventTuiToastShow, EventTuiSessionSelect]) const EventTuiCommandExecute = Schema.Struct({
type: Schema.Literal(TuiEvent.CommandExecute.type),
properties: TuiEvent.CommandExecute.properties,
}).annotate({ identifier: "EventTuiCommandExecute" })
const EventTuiToastShow = Schema.Struct({
type: Schema.Literal(TuiEvent.ToastShow.type),
properties: TuiEvent.ToastShow.properties,
}).annotate({ identifier: "EventTuiToastShow" })
const EventTuiSessionSelect = Schema.Struct({
type: Schema.Literal(TuiEvent.SessionSelect.type),
properties: TuiEvent.SessionSelect.properties,
}).annotate({ identifier: "EventTuiSessionSelect" })
export const TuiPublishPayload = Schema.Union([
EventTuiPromptAppend,
EventTuiCommandExecute,
EventTuiToastShow,
EventTuiSessionSelect,
])
export const TuiPaths = { export const TuiPaths = {
appendPrompt: `${root}/append-prompt`, appendPrompt: `${root}/append-prompt`,
@@ -48,42 +65,54 @@ export const TuiApi = HttpApi.make("tui")
description: "Append prompt to the TUI.", description: "Append prompt to the TUI.",
}), }),
), ),
HttpApiEndpoint.post("openHelp", TuiPaths.openHelp, { success: described(Schema.Boolean, "Help dialog opened successfully") }).annotateMerge( HttpApiEndpoint.post("openHelp", TuiPaths.openHelp, {
success: described(Schema.Boolean, "Help dialog opened successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.openHelp", identifier: "tui.openHelp",
summary: "Open help dialog", summary: "Open help dialog",
description: "Open the help dialog in the TUI to display user assistance information.", description: "Open the help dialog in the TUI to display user assistance information.",
}), }),
), ),
HttpApiEndpoint.post("openSessions", TuiPaths.openSessions, { success: described(Schema.Boolean, "Session dialog opened successfully") }).annotateMerge( HttpApiEndpoint.post("openSessions", TuiPaths.openSessions, {
success: described(Schema.Boolean, "Session dialog opened successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.openSessions", identifier: "tui.openSessions",
summary: "Open sessions dialog", summary: "Open sessions dialog",
description: "Open the session dialog.", description: "Open the session dialog.",
}), }),
), ),
HttpApiEndpoint.post("openThemes", TuiPaths.openThemes, { success: described(Schema.Boolean, "Theme dialog opened successfully") }).annotateMerge( HttpApiEndpoint.post("openThemes", TuiPaths.openThemes, {
success: described(Schema.Boolean, "Theme dialog opened successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.openThemes", identifier: "tui.openThemes",
summary: "Open themes dialog", summary: "Open themes dialog",
description: "Open the theme dialog.", description: "Open the theme dialog.",
}), }),
), ),
HttpApiEndpoint.post("openModels", TuiPaths.openModels, { success: described(Schema.Boolean, "Model dialog opened successfully") }).annotateMerge( HttpApiEndpoint.post("openModels", TuiPaths.openModels, {
success: described(Schema.Boolean, "Model dialog opened successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.openModels", identifier: "tui.openModels",
summary: "Open models dialog", summary: "Open models dialog",
description: "Open the model dialog.", description: "Open the model dialog.",
}), }),
), ),
HttpApiEndpoint.post("submitPrompt", TuiPaths.submitPrompt, { success: described(Schema.Boolean, "Prompt submitted successfully") }).annotateMerge( HttpApiEndpoint.post("submitPrompt", TuiPaths.submitPrompt, {
success: described(Schema.Boolean, "Prompt submitted successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.submitPrompt", identifier: "tui.submitPrompt",
summary: "Submit TUI prompt", summary: "Submit TUI prompt",
description: "Submit the prompt.", description: "Submit the prompt.",
}), }),
), ),
HttpApiEndpoint.post("clearPrompt", TuiPaths.clearPrompt, { success: described(Schema.Boolean, "Prompt cleared successfully") }).annotateMerge( HttpApiEndpoint.post("clearPrompt", TuiPaths.clearPrompt, {
success: described(Schema.Boolean, "Prompt cleared successfully"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.clearPrompt", identifier: "tui.clearPrompt",
summary: "Clear TUI prompt", summary: "Clear TUI prompt",
@@ -133,7 +162,9 @@ export const TuiApi = HttpApi.make("tui")
description: "Navigate the TUI to display the specified session.", description: "Navigate the TUI to display the specified session.",
}), }),
), ),
HttpApiEndpoint.get("controlNext", TuiPaths.controlNext, { success: described(TuiRequestPayload, "Next TUI request") }).annotateMerge( HttpApiEndpoint.get("controlNext", TuiPaths.controlNext, {
success: described(TuiRequestPayload, "Next TUI request"),
}).annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
identifier: "tui.control.next", identifier: "tui.control.next",
summary: "Get next TUI request", summary: "Get next TUI request",
@@ -9,9 +9,7 @@ import { described } from "./metadata"
const root = "/experimental/workspace" const root = "/experimental/workspace"
export const CreatePayload = Schema.Struct(Struct.omit(Workspace.CreateInput.fields, ["projectID"])) export const CreatePayload = Schema.Struct(Struct.omit(Workspace.CreateInput.fields, ["projectID"]))
export const SessionRestorePayload = Schema.Struct( export const SessionRestorePayload = Schema.Struct(Struct.omit(Workspace.SessionRestoreInput.fields, ["workspaceID"]))
Struct.omit(Workspace.SessionRestoreInput.fields, ["workspaceID"]),
)
export const SessionRestoreResponse = Schema.Struct({ export const SessionRestoreResponse = Schema.Struct({
total: NonNegativeInt, total: NonNegativeInt,
}) })
@@ -88,7 +88,9 @@ export const ptyConnectRoute = HttpRouter.add(
}, },
send: (data: string | Uint8Array | ArrayBuffer) => { send: (data: string | Uint8Array | ArrayBuffer) => {
if (closed) return if (closed) return
Effect.runFork(write(data instanceof ArrayBuffer ? new Uint8Array(data) : data).pipe(Effect.catch(() => Effect.void))) Effect.runFork(
write(data instanceof ArrayBuffer ? new Uint8Array(data) : data).pipe(Effect.catch(() => Effect.void)),
)
}, },
close: (code?: number, reason?: string) => { close: (code?: number, reason?: string) => {
if (closed) return if (closed) return
@@ -25,7 +25,20 @@ import * as Stream from "effect/Stream"
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http" import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi" import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
import { InstanceHttpApi } from "../api" import { InstanceHttpApi } from "../api"
import { CommandPayload, DiffQuery, ForkPayload, InitPayload, ListQuery, MessagesQuery, PermissionResponsePayload, PromptPayload, RevertPayload, ShellPayload, SummarizePayload, UpdatePayload } from "../groups/session" import {
CommandPayload,
DiffQuery,
ForkPayload,
InitPayload,
ListQuery,
MessagesQuery,
PermissionResponsePayload,
PromptPayload,
RevertPayload,
ShellPayload,
SummarizePayload,
UpdatePayload,
} from "../groups/session"
const log = Log.create({ service: "server" }) const log = Log.create({ service: "server" })
@@ -88,7 +101,8 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
params: { sessionID: SessionID } params: { sessionID: SessionID }
query: typeof MessagesQuery.Type query: typeof MessagesQuery.Type
}) { }) {
return yield* mapNotFound(Effect.gen(function* () { return yield* mapNotFound(
Effect.gen(function* () {
if (ctx.query.before && ctx.query.limit === undefined) return yield* new HttpApiError.BadRequest({}) if (ctx.query.before && ctx.query.limit === undefined) return yield* new HttpApiError.BadRequest({})
if (ctx.query.before) { if (ctx.query.before) {
const before = ctx.query.before const before = ctx.query.before
@@ -121,7 +135,8 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
"X-Next-Cursor": page.cursor, "X-Next-Cursor": page.cursor,
}, },
}) })
})) }),
)
}) })
const message = Effect.fn("SessionHttpApi.message")(function* (ctx: { const message = Effect.fn("SessionHttpApi.message")(function* (ctx: {
@@ -19,11 +19,12 @@ import * as Socket from "effect/unstable/socket/Socket"
type HandlerEffect = Effect.Effect<HttpServerResponse.HttpServerResponse, unhandled, never> type HandlerEffect = Effect.Effect<HttpServerResponse.HttpServerResponse, unhandled, never>
export class InstanceContextMiddleware extends HttpApiMiddleware.Service<InstanceContextMiddleware, { export class InstanceContextMiddleware extends HttpApiMiddleware.Service<
InstanceContextMiddleware,
{
requires: Session.Service requires: Session.Service
}>()( }
"@opencode/ExperimentalHttpApiInstanceContext", >()("@opencode/ExperimentalHttpApiInstanceContext") {}
) {}
function decode(input: string) { function decode(input: string) {
try { try {
@@ -53,9 +54,14 @@ function requestHeaders(request: HttpServerRequest.HttpServerRequest) {
return sourceRequest(request).headers return sourceRequest(request).headers
} }
function writeSocket(write: (data: string | Uint8Array | Socket.CloseEvent) => Effect.Effect<void, unknown>, data: unknown) { function writeSocket(
write: (data: string | Uint8Array | Socket.CloseEvent) => Effect.Effect<void, unknown>,
data: unknown,
) {
if (data instanceof Blob) { if (data instanceof Blob) {
void data.arrayBuffer().then((buffer) => Effect.runFork(write(new Uint8Array(buffer)).pipe(Effect.catch(() => Effect.void)))) void data
.arrayBuffer()
.then((buffer) => Effect.runFork(write(new Uint8Array(buffer)).pipe(Effect.catch(() => Effect.void))))
return return
} }
if (typeof data === "string" || data instanceof Uint8Array) { if (typeof data === "string" || data instanceof Uint8Array) {
@@ -78,7 +84,8 @@ function proxyWebSocket(request: HttpServerRequest.HttpServerRequest, target: st
queue.length = 0 queue.length = 0
} }
remote.onmessage = (event) => writeSocket(write, event.data) remote.onmessage = (event) => writeSocket(write, event.data)
remote.onerror = () => Effect.runFork(write(new Socket.CloseEvent(1011, "proxy error")).pipe(Effect.catch(() => Effect.void))) remote.onerror = () =>
Effect.runFork(write(new Socket.CloseEvent(1011, "proxy error")).pipe(Effect.catch(() => Effect.void)))
remote.onclose = (event) => remote.onclose = (event) =>
Effect.runFork(write(new Socket.CloseEvent(event.code, event.reason)).pipe(Effect.catch(() => Effect.void))) Effect.runFork(write(new Socket.CloseEvent(event.code, event.reason)).pipe(Effect.catch(() => Effect.void)))
@@ -109,7 +116,9 @@ function proxyRemote(
const url = workspaceProxyURL(target.url, requestURL) const url = workspaceProxyURL(target.url, requestURL)
const source = sourceRequest(request) const source = sourceRequest(request)
if (source.headers.get("upgrade")?.toLowerCase() === "websocket") return proxyWebSocket(request, url) if (source.headers.get("upgrade")?.toLowerCase() === "websocket") return proxyWebSocket(request, url)
return Effect.promise(() => ServerProxy.http(url, target.headers, source, workspace.id)).pipe(Effect.map(HttpServerResponse.raw)) return Effect.promise(() => ServerProxy.http(url, target.headers, source, workspace.id)).pipe(
Effect.map(HttpServerResponse.raw),
)
} }
function requestContext() { function requestContext() {
@@ -118,14 +127,19 @@ function requestContext() {
) )
} }
function provideRequestContext(effect: HandlerEffect, request: HttpServerRequest.HttpServerRequest, sessionWorkspaceID?: WorkspaceID) { function provideRequestContext(
effect: HandlerEffect,
request: HttpServerRequest.HttpServerRequest,
sessionWorkspaceID?: WorkspaceID,
) {
return Effect.gen(function* () { return Effect.gen(function* () {
const url = new URL(request.url, "http://localhost") const url = new URL(request.url, "http://localhost")
const headers = requestHeaders(request) const headers = requestHeaders(request)
const envWorkspaceID = Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined const envWorkspaceID = Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined
const workspaceParam = url.searchParams.get("workspace") const workspaceParam = url.searchParams.get("workspace")
const workspaceID = sessionWorkspaceID ?? (workspaceParam ? WorkspaceID.make(workspaceParam) : undefined) const workspaceID = sessionWorkspaceID ?? (workspaceParam ? WorkspaceID.make(workspaceParam) : undefined)
const workspace = workspaceID && !envWorkspaceID ? yield* Effect.promise(() => Workspace.get(workspaceID)) : undefined const workspace =
workspaceID && !envWorkspaceID ? yield* Effect.promise(() => Workspace.get(workspaceID)) : undefined
if (workspaceID && !workspace && !envWorkspaceID) { if (workspaceID && !workspace && !envWorkspaceID) {
return HttpServerResponse.text(`Workspace not found: ${workspaceID}`, { return HttpServerResponse.text(`Workspace not found: ${workspaceID}`, {
@@ -134,7 +148,12 @@ function provideRequestContext(effect: HandlerEffect, request: HttpServerRequest
}) })
} }
if (workspace && !isLocalWorkspaceRoute(request.method, url.pathname) && !url.pathname.startsWith("/console") && !envWorkspaceID) { if (
workspace &&
!isLocalWorkspaceRoute(request.method, url.pathname) &&
!url.pathname.startsWith("/console") &&
!envWorkspaceID
) {
const adaptor = yield* Effect.promise(() => getAdaptor(workspace.projectID, workspace.type)) const adaptor = yield* Effect.promise(() => getAdaptor(workspace.projectID, workspace.type))
const target = yield* Effect.promise(() => Promise.resolve(adaptor.target(workspace))) const target = yield* Effect.promise(() => Promise.resolve(adaptor.target(workspace)))
if (target.type === "remote") return yield* proxyRemote(request, workspace, target, url) if (target.type === "remote") return yield* proxyRemote(request, workspace, target, url)
@@ -186,6 +205,8 @@ export const instanceContextLayer = Layer.succeed(
InstanceContextMiddleware.of((effect) => provideInstanceContext(effect)), InstanceContextMiddleware.of((effect) => provideInstanceContext(effect)),
) )
export const instanceRouterLayer = HttpRouter.middleware()(Effect.succeed((effect) => export const instanceRouterLayer = HttpRouter.middleware()(
Effect.succeed((effect) =>
requestContext().pipe(Effect.flatMap((request) => provideRequestContext(effect, request))), requestContext().pipe(Effect.flatMap((request) => provideRequestContext(effect, request))),
)).layer ),
).layer
@@ -14,7 +14,10 @@ export const markInstanceForDisposal = (ctx: InstanceContext) =>
export const markInstanceForReload = (ctx: InstanceContext, next: Parameters<typeof Instance.reload>[0]) => export const markInstanceForReload = (ctx: InstanceContext, next: Parameters<typeof Instance.reload>[0]) =>
HttpEffect.appendPreResponseHandler((_request, response) => HttpEffect.appendPreResponseHandler((_request, response) =>
Effect.as(Effect.uninterruptible(Effect.promise(() => Instance.restore(ctx, () => Instance.reload(next)))), response), Effect.as(
Effect.uninterruptible(Effect.promise(() => Instance.restore(ctx, () => Instance.reload(next)))),
response,
),
) )
export const disposeMiddleware: HttpMiddleware.HttpMiddleware = (effect) => export const disposeMiddleware: HttpMiddleware.HttpMiddleware = (effect) =>
@@ -126,8 +126,13 @@ function matchLegacyOpenApi(input: Record<string, unknown>) {
// Workspace creation fields `branch` and `extra` are Schema.NullOr — // Workspace creation fields `branch` and `extra` are Schema.NullOr —
// genuinely nullable, not just optional. Re-add the null that the // genuinely nullable, not just optional. Re-add the null that the
// component-level strip above removed. // component-level strip above removed.
const ref = operation.requestBody.content?.["application/json"]?.schema?.$ref?.replace("#/components/schemas/", "") const ref = operation.requestBody.content?.["application/json"]?.schema?.$ref?.replace(
const properties = ref ? spec.components?.schemas?.[ref]?.properties : operation.requestBody.content?.["application/json"]?.schema?.properties "#/components/schemas/",
"",
)
const properties = ref
? spec.components?.schemas?.[ref]?.properties
: operation.requestBody.content?.["application/json"]?.schema?.properties
if (properties?.branch) properties.branch = { anyOf: [properties.branch, { type: "null" }] } if (properties?.branch) properties.branch = { anyOf: [properties.branch, { type: "null" }] }
if (properties?.extra) properties.extra = { anyOf: [properties.extra, { type: "null" }] } if (properties?.extra) properties.extra = { anyOf: [properties.extra, { type: "null" }] }
} }
@@ -150,7 +155,10 @@ function matchLegacyOpenApi(input: Record<string, unknown>) {
description: "Event stream", description: "Event stream",
content: { content: {
"text/event-stream": { "text/event-stream": {
schema: path === "/event" ? { $ref: "#/components/schemas/Event" } : { $ref: "#/components/schemas/GlobalEvent" }, schema:
path === "/event"
? { $ref: "#/components/schemas/Event" }
: { $ref: "#/components/schemas/GlobalEvent" },
}, },
}, },
} }
@@ -251,7 +259,8 @@ function applyLegacySchemaOverrides(spec: OpenApiSpec) {
schemas.Workspace.properties.directory = nullable(schemas.Workspace.properties.directory) schemas.Workspace.properties.directory = nullable(schemas.Workspace.properties.directory)
schemas.Workspace.properties.extra = nullable(schemas.Workspace.properties.extra) schemas.Workspace.properties.extra = nullable(schemas.Workspace.properties.extra)
} }
if (schemas.GlobalSession?.properties?.project) schemas.GlobalSession.properties.project = nullable(schemas.GlobalSession.properties.project) if (schemas.GlobalSession?.properties?.project)
schemas.GlobalSession.properties.project = nullable(schemas.GlobalSession.properties.project)
const providerOptions = schemas.ProviderConfig?.properties?.options const providerOptions = schemas.ProviderConfig?.properties?.options
if (providerOptions) providerOptions.additionalProperties = {} if (providerOptions) providerOptions.additionalProperties = {}
const model = schemas.ProviderConfig?.properties?.models?.additionalProperties const model = schemas.ProviderConfig?.properties?.models?.additionalProperties
@@ -486,12 +495,11 @@ function normalizeParameter(param: OpenApiParameter, route: string) {
param.schema = stripOptionalNull(param.schema) param.schema = stripOptionalNull(param.schema)
} }
export const PublicApi = OpenCodeHttpApi export const PublicApi = OpenCodeHttpApi.annotateMerge(
.annotateMerge(
OpenApi.annotations({ OpenApi.annotations({
title: "opencode", title: "opencode",
version: "1.0.0", version: "1.0.0",
description: "opencode api", description: "opencode api",
transform: matchLegacyOpenApi, transform: matchLegacyOpenApi,
}), }),
) )
+7 -2
View File
@@ -38,7 +38,9 @@ type ServerApp = {
request(input: string | URL | Request, init?: RequestInit): Response | Promise<Response> request(input: string | URL | Request, init?: RequestInit): Response | Promise<Response>
} }
const DefaultHono = lazy(() => withBackend({ backend: "hono", reason: "stable" }, createHono({}, { backend: "hono", reason: "stable" }))) const DefaultHono = lazy(() =>
withBackend({ backend: "hono", reason: "stable" }, createHono({}, { backend: "hono", reason: "stable" })),
)
const DefaultHttpApi = lazy(() => createDefaultHttpApi()) const DefaultHttpApi = lazy(() => createDefaultHttpApi())
function select() { function select() {
@@ -86,7 +88,10 @@ function createHttpApi() {
} }
} }
function createHono(opts: { cors?: string[] }, selection: ServerBackend.Selection = ServerBackend.force(select(), "hono")) { function createHono(
opts: { cors?: string[] },
selection: ServerBackend.Selection = ServerBackend.force(select(), "hono"),
) {
const backendAttributes = ServerBackend.attributes(selection) const backendAttributes = ServerBackend.attributes(selection)
const app = new Hono() const app = new Hono()
.onError(ErrorMiddleware) .onError(ErrorMiddleware)
+3 -1
View File
@@ -461,7 +461,9 @@ type AssistantError = z.infer<typeof AssistantErrorZod>
// Effect Schema for the same union — used by HttpApi OpenAPI generation. // Effect Schema for the same union — used by HttpApi OpenAPI generation.
const AssistantErrorSchema = Schema.Union([ const AssistantErrorSchema = Schema.Union([
AuthError.EffectSchema, AuthError.EffectSchema,
Schema.Struct({ name: Schema.Literal("UnknownError"), data: Schema.Struct({ message: Schema.String }) }).annotate({ identifier: "UnknownError" }), Schema.Struct({ name: Schema.Literal("UnknownError"), data: Schema.Struct({ message: Schema.String }) }).annotate({
identifier: "UnknownError",
}),
OutputLengthError.EffectSchema, OutputLengthError.EffectSchema,
AbortedError.EffectSchema, AbortedError.EffectSchema,
StructuredOutputError.EffectSchema, StructuredOutputError.EffectSchema,
-2
View File
@@ -11,8 +11,6 @@ export const PositiveInt = Schema.Int.check(Schema.isGreaterThan(0))
*/ */
export const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)) export const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))
/** /**
* Optional public JSON field that can hold explicit `undefined` on the type * Optional public JSON field that can hold explicit `undefined` on the type
* side but encodes it as an omitted key, matching legacy `JSON.stringify`. * side but encodes it as an omitted key, matching legacy `JSON.stringify`.
@@ -126,9 +126,9 @@ function requestBodyKey(spec: OpenApiSpec, body: unknown) {
function requestBodySchemaKind(spec: OpenApiSpec, schema: OpenApiSchema | undefined) { function requestBodySchemaKind(spec: OpenApiSpec, schema: OpenApiSchema | undefined) {
if (!schema) return "" if (!schema) return ""
const resolved = (schema.$ref ? spec.components?.schemas?.[schema.$ref.replace("#/components/schemas/", "")] : schema) as const resolved = (
| OpenApiSchema schema.$ref ? spec.components?.schemas?.[schema.$ref.replace("#/components/schemas/", "")] : schema
| undefined ) as OpenApiSchema | undefined
if (resolved?.properties) return "object" if (resolved?.properties) return "object"
if (resolved?.anyOf ?? resolved?.oneOf ?? resolved?.allOf) return "object" if (resolved?.anyOf ?? resolved?.oneOf ?? resolved?.allOf) return "object"
return resolved?.type ?? schema.type ?? "inline" return resolved?.type ?? schema.type ?? "inline"
@@ -214,7 +214,11 @@ describe("workspace HttpApi", () => {
const workspace = await Instance.provide({ const workspace = await Instance.provide({
directory: tmp.path, directory: tmp.path,
fn: async () => { fn: async () => {
registerAdaptor(Instance.project.id, "remote-target", remoteAdaptor(path.join(tmp.path, ".remote"), "https://remote.test/base")) registerAdaptor(
Instance.project.id,
"remote-target",
remoteAdaptor(path.join(tmp.path, ".remote"), "https://remote.test/base"),
)
return Workspace.create({ return Workspace.create({
type: "remote-target", type: "remote-target",
branch: null, branch: null,
+267 -95
View File
@@ -1339,10 +1339,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"rows": { "rows": {
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}, },
"cols": { "cols": {
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["rows", "cols"] "required": ["rows", "cols"]
@@ -5595,10 +5599,14 @@
"required": ["text"] "required": ["text"]
}, },
"line_number": { "line_number": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"absolute_offset": { "absolute_offset": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"submatches": { "submatches": {
"type": "array", "type": "array",
@@ -5615,10 +5623,14 @@
"required": ["text"] "required": ["text"]
}, },
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["match", "start", "end"] "required": ["match", "start", "end"]
@@ -6901,7 +6913,9 @@
}, },
"duration": { "duration": {
"description": "Duration in milliseconds", "description": "Duration in milliseconds",
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["message", "variant"] "required": ["message", "variant"]
@@ -7621,13 +7635,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"updated": { "updated": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"initialized": { "initialized": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created", "updated"] "required": ["created", "updated"]
@@ -7913,10 +7933,14 @@
"type": "string" "type": "string"
}, },
"additions": { "additions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"deletions": { "deletions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"status": { "status": {
"type": "string", "type": "string",
@@ -8039,7 +8063,9 @@
"type": "string" "type": "string"
}, },
"retries": { "retries": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["message", "retries"] "required": ["message", "retries"]
@@ -8083,7 +8109,9 @@
"type": "string" "type": "string"
}, },
"statusCode": { "statusCode": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"isRetryable": { "isRetryable": {
"type": "boolean" "type": "boolean"
@@ -8420,13 +8448,17 @@
"const": "retry" "const": "retry"
}, },
"attempt": { "attempt": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"message": { "message": {
"type": "string" "type": "string"
}, },
"next": { "next": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["type", "attempt", "message", "next"] "required": ["type", "attempt", "message", "next"]
@@ -8591,7 +8623,9 @@
}, },
"duration": { "duration": {
"description": "Duration in milliseconds", "description": "Duration in milliseconds",
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["message", "variant"] "required": ["message", "variant"]
@@ -8777,7 +8811,9 @@
"enum": ["running", "exited"] "enum": ["running", "exited"]
}, },
"pid": { "pid": {
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["id", "title", "command", "args", "cwd", "status", "pid"] "required": ["id", "title", "command", "args", "cwd", "status", "pid"]
@@ -8835,7 +8871,9 @@
"pattern": "^pty.*" "pattern": "^pty.*"
}, },
"exitCode": { "exitCode": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["id", "exitCode"] "required": ["id", "exitCode"]
@@ -9024,7 +9062,9 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created"] "required": ["created"]
@@ -9102,10 +9142,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"completed": { "completed": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created"] "required": ["created"]
@@ -9173,25 +9217,37 @@
"type": "object", "type": "object",
"properties": { "properties": {
"total": { "total": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"input": { "input": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"output": { "output": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"reasoning": { "reasoning": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"cache": { "cache": {
"type": "object", "type": "object",
"properties": { "properties": {
"read": { "read": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"write": { "write": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["read", "write"] "required": ["read", "write"]
@@ -9311,10 +9367,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start"] "required": ["start"]
@@ -9408,10 +9468,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start"] "required": ["start"]
@@ -9427,12 +9491,12 @@
}, },
"start": { "start": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
}, },
"end": { "end": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
} }
}, },
@@ -9461,10 +9525,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"line": { "line": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"character": { "character": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["line", "character"] "required": ["line", "character"]
@@ -9473,10 +9541,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"line": { "line": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"character": { "character": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["line", "character"] "required": ["line", "character"]
@@ -9505,7 +9577,7 @@
}, },
"kind": { "kind": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
} }
}, },
@@ -9625,7 +9697,9 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start"] "required": ["start"]
@@ -9664,13 +9738,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"compacted": { "compacted": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start", "end"] "required": ["start", "end"]
@@ -9712,10 +9792,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start", "end"] "required": ["start", "end"]
@@ -9834,25 +9918,37 @@
"type": "object", "type": "object",
"properties": { "properties": {
"total": { "total": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"input": { "input": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"output": { "output": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"reasoning": { "reasoning": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"cache": { "cache": {
"type": "object", "type": "object",
"properties": { "properties": {
"read": { "read": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"write": { "write": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["read", "write"] "required": ["read", "write"]
@@ -9949,12 +10045,12 @@
}, },
"start": { "start": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
}, },
"end": { "end": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
} }
}, },
@@ -9983,7 +10079,9 @@
"const": "retry" "const": "retry"
}, },
"attempt": { "attempt": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"error": { "error": {
"$ref": "#/components/schemas/APIError" "$ref": "#/components/schemas/APIError"
@@ -9992,7 +10090,9 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created"] "required": ["created"]
@@ -10090,7 +10190,9 @@
"$ref": "#/components/schemas/Part" "$ref": "#/components/schemas/Part"
}, },
"time": { "time": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["sessionID", "part", "time"] "required": ["sessionID", "part", "time"]
@@ -10182,13 +10284,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"additions": { "additions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"deletions": { "deletions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"files": { "files": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"diffs": { "diffs": {
"type": "array", "type": "array",
@@ -10218,16 +10326,24 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"updated": { "updated": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"compacting": { "compacting": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"archived": { "archived": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created", "updated"] "required": ["created", "updated"]
@@ -10434,7 +10550,9 @@
"$ref": "#/components/schemas/Part" "$ref": "#/components/schemas/Part"
}, },
"time": { "time": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["sessionID", "part", "time"] "required": ["sessionID", "part", "time"]
@@ -10631,13 +10749,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"additions": { "additions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"deletions": { "deletions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"files": { "files": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"diffs": { "diffs": {
"type": "array", "type": "array",
@@ -10694,7 +10818,9 @@
"created": { "created": {
"anyOf": [ "anyOf": [
{ {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
{ {
"type": "null" "type": "null"
@@ -10704,7 +10830,9 @@
"updated": { "updated": {
"anyOf": [ "anyOf": [
{ {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
{ {
"type": "null" "type": "null"
@@ -10714,7 +10842,9 @@
"compacting": { "compacting": {
"anyOf": [ "anyOf": [
{ {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
{ {
"type": "null" "type": "null"
@@ -10724,7 +10854,9 @@
"archived": { "archived": {
"anyOf": [ "anyOf": [
{ {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
{ {
"type": "null" "type": "null"
@@ -11481,7 +11613,9 @@
}, },
"timeout": { "timeout": {
"description": "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.", "description": "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.",
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["type", "command"] "required": ["type", "command"]
@@ -11547,7 +11681,9 @@
}, },
"timeout": { "timeout": {
"description": "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.", "description": "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.",
"type": "number" "type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["type", "url"] "required": ["type", "url"]
@@ -12055,7 +12191,9 @@
"type": "string" "type": "string"
}, },
"expires": { "expires": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"accountId": { "accountId": {
"type": "string" "type": "string"
@@ -12458,7 +12596,9 @@
"type": "string" "type": "string"
}, },
"switchableOrgCount": { "switchableOrgCount": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["consoleManagedProviders", "switchableOrgCount"] "required": ["consoleManagedProviders", "switchableOrgCount"]
@@ -12579,13 +12719,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"additions": { "additions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"deletions": { "deletions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"files": { "files": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"diffs": { "diffs": {
"type": "array", "type": "array",
@@ -12615,16 +12761,24 @@
"type": "object", "type": "object",
"properties": { "properties": {
"created": { "created": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"updated": { "updated": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"compacting": { "compacting": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"archived": { "archived": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["created", "updated"] "required": ["created", "updated"]
@@ -12710,10 +12864,14 @@
"type": "object", "type": "object",
"properties": { "properties": {
"start": { "start": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"end": { "end": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
} }
}, },
"required": ["start"] "required": ["start"]
@@ -12776,12 +12934,12 @@
}, },
"start": { "start": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
}, },
"end": { "end": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
} }
}, },
@@ -12956,7 +13114,9 @@
"type": "string" "type": "string"
}, },
"kind": { "kind": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"location": { "location": {
"type": "object", "type": "object",
@@ -13029,16 +13189,24 @@
"type": "object", "type": "object",
"properties": { "properties": {
"oldStart": { "oldStart": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"oldLines": { "oldLines": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"newStart": { "newStart": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"newLines": { "newLines": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"lines": { "lines": {
"type": "array", "type": "array",
@@ -13074,12 +13242,12 @@
}, },
"added": { "added": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
}, },
"removed": { "removed": {
"type": "integer", "type": "integer",
"minimum": -9007199254740991, "minimum": 0,
"maximum": 9007199254740991 "maximum": 9007199254740991
}, },
"status": { "status": {
@@ -13360,10 +13528,14 @@
"type": "string" "type": "string"
}, },
"additions": { "additions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"deletions": { "deletions": {
"type": "number" "type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}, },
"status": { "status": {
"type": "string", "type": "string",