feat(server): add permission request endpoints (#33774)

This commit is contained in:
Dax 2026-06-25 09:55:17 -04:00 committed by GitHub
commit 7f40aeab21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 287 additions and 2 deletions

View file

@ -4,7 +4,7 @@ import { PermissionSaved } from "@opencode-ai/core/permission/saved"
import { Effect } from "effect"
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi"
import { Api } from "../api"
import { PermissionNotFoundError } from "@opencode-ai/protocol/errors"
import { PermissionNotFoundError, SessionNotFoundError } from "@opencode-ai/protocol/errors"
import { response } from "../location"
function missingRequest(id: PermissionV2.ID) {
@ -20,6 +20,35 @@ export const PermissionHandler = HttpApiBuilder.group(Api, "server.permission",
return yield* response((yield* PermissionV2.Service).list())
}),
)
.handle(
"session.permission.create",
Effect.fn(function* (ctx) {
const permission = yield* PermissionV2.Service
return {
data: yield* permission
.ask({
id: ctx.payload.id,
sessionID: ctx.params.sessionID,
action: ctx.payload.action,
resources: ctx.payload.resources,
save: ctx.payload.save,
metadata: ctx.payload.metadata,
source: ctx.payload.source,
agent: ctx.payload.agent,
})
.pipe(
Effect.catchTag(
"Session.NotFoundError",
(error) =>
new SessionNotFoundError({
sessionID: error.sessionID,
message: `Session not found: ${error.sessionID}`,
}),
),
),
}
}),
)
.handle(
"session.permission.list",
Effect.fn(function* (ctx) {
@ -27,6 +56,14 @@ export const PermissionHandler = HttpApiBuilder.group(Api, "server.permission",
return { data: yield* permission.forSession(ctx.params.sessionID) }
}),
)
.handle(
"session.permission.get",
Effect.fn(function* (ctx) {
const request = yield* (yield* PermissionV2.Service).get(ctx.params.requestID)
if (!request || request.sessionID !== ctx.params.sessionID) return yield* missingRequest(ctx.params.requestID)
return { data: request }
}),
)
.handle(
"session.permission.reply",
Effect.fn(function* (ctx) {