summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorShoubhit Dash <[email protected]>2026-04-15 04:57:18 +0530
committerDax Raad <[email protected]>2026-04-14 20:55:41 -0400
commit467e5689ec6187f811afacc337d411863dc9e9ca (patch)
tree21fcf828a805b52859abd65c2744fe92d01fdf54 /packages
parentfba752a5016a93ad7ea54890cf444de02a89a0f8 (diff)
downloadopencode-467e5689ec6187f811afacc337d411863dc9e9ca.tar.gz
opencode-467e5689ec6187f811afacc337d411863dc9e9ca.zip
feat(server): extract question handler factory
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/server/instance/httpapi/question.ts36
-rw-r--r--packages/server/package.json3
-rw-r--r--packages/server/src/api/index.ts3
-rw-r--r--packages/server/src/api/question.ts37
-rw-r--r--packages/server/src/index.ts2
5 files changed, 55 insertions, 26 deletions
diff --git a/packages/opencode/src/server/instance/httpapi/question.ts b/packages/opencode/src/server/instance/httpapi/question.ts
index 7aae89c19..ef0f41734 100644
--- a/packages/opencode/src/server/instance/httpapi/question.ts
+++ b/packages/opencode/src/server/instance/httpapi/question.ts
@@ -3,39 +3,27 @@ import { memoMap } from "@/effect/run-service"
import { Question } from "@/question"
import { QuestionID } from "@/question/schema"
import { lazy } from "@/util/lazy"
-import { QuestionReply, QuestionRequest, questionApi } from "@opencode-ai/server"
-import { Effect, Layer, Schema } from "effect"
+import { makeQuestionHandler, questionApi } from "@opencode-ai/server"
+import { Effect, Layer } from "effect"
import { HttpRouter, HttpServer } from "effect/unstable/http"
import { HttpApiBuilder } from "effect/unstable/httpapi"
import type { Handler } from "hono"
const root = "/experimental/httpapi/question"
-const QuestionLive = HttpApiBuilder.group(
- questionApi,
- "question",
- Effect.fn("QuestionHttpApi.handlers")(function* (handlers) {
+const QuestionLive = makeQuestionHandler({
+ list: Effect.fn("QuestionHttpApi.host.list")(function* () {
const svc = yield* Question.Service
- const decode = Schema.decodeUnknownSync(Schema.Array(QuestionRequest))
-
- const list = Effect.fn("QuestionHttpApi.list")(function* () {
- return decode(yield* svc.list())
- })
-
- const reply = Effect.fn("QuestionHttpApi.reply")(function* (ctx: {
- params: { requestID: string }
- payload: Schema.Schema.Type<typeof QuestionReply>
- }) {
- yield* svc.reply({
- requestID: QuestionID.make(ctx.params.requestID),
- answers: ctx.payload.answers,
- })
- return true
+ return yield* svc.list()
+ }),
+ reply: Effect.fn("QuestionHttpApi.host.reply")(function* (input) {
+ const svc = yield* Question.Service
+ yield* svc.reply({
+ requestID: QuestionID.make(input.requestID),
+ answers: input.answers,
})
-
- return handlers.handle("list", list).handle("reply", reply)
}),
-).pipe(Layer.provide(Question.defaultLayer))
+}).pipe(Layer.provide(Question.defaultLayer))
const web = lazy(() =>
HttpRouter.toWebHandler(
diff --git a/packages/server/package.json b/packages/server/package.json
index 3fc013310..ec4c325fd 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -10,7 +10,8 @@
"./definition": "./src/definition/index.ts",
"./definition/api": "./src/definition/api.ts",
"./definition/question": "./src/definition/question.ts",
- "./api": "./src/api/index.ts"
+ "./api": "./src/api/index.ts",
+ "./api/question": "./src/api/question.ts"
},
"files": [
"dist"
diff --git a/packages/server/src/api/index.ts b/packages/server/src/api/index.ts
index 336ce12bb..375e3584b 100644
--- a/packages/server/src/api/index.ts
+++ b/packages/server/src/api/index.ts
@@ -1 +1,2 @@
-export {}
+export { makeQuestionHandler } from "./question.js"
+export type { QuestionOps } from "./question.js"
diff --git a/packages/server/src/api/question.ts b/packages/server/src/api/question.ts
new file mode 100644
index 000000000..f72c37aa1
--- /dev/null
+++ b/packages/server/src/api/question.ts
@@ -0,0 +1,37 @@
+import { Effect, Schema } from "effect"
+import { HttpApiBuilder } from "effect/unstable/httpapi"
+import { QuestionReply, QuestionRequest, questionApi } from "../definition/question.js"
+
+export interface QuestionOps<R = never> {
+ readonly list: () => Effect.Effect<ReadonlyArray<unknown>, never, R>
+ readonly reply: (input: {
+ requestID: string
+ answers: Schema.Schema.Type<typeof QuestionReply>["answers"]
+ }) => Effect.Effect<void, never, R>
+}
+
+export const makeQuestionHandler = <R>(ops: QuestionOps<R>) =>
+ HttpApiBuilder.group(
+ questionApi,
+ "question",
+ Effect.fn("QuestionHttpApi.handlers")(function* (handlers) {
+ const decode = Schema.decodeUnknownSync(Schema.Array(QuestionRequest))
+
+ const list = Effect.fn("QuestionHttpApi.list")(function* () {
+ return decode(yield* ops.list())
+ })
+
+ const reply = Effect.fn("QuestionHttpApi.reply")(function* (ctx: {
+ params: { requestID: string }
+ payload: Schema.Schema.Type<typeof QuestionReply>
+ }) {
+ yield* ops.reply({
+ requestID: ctx.params.requestID,
+ answers: ctx.payload.answers,
+ })
+ return true
+ })
+
+ return handlers.handle("list", list).handle("reply", reply)
+ }),
+ )
diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts
index d5bdb6c8d..67b82a0be 100644
--- a/packages/server/src/index.ts
+++ b/packages/server/src/index.ts
@@ -1,4 +1,6 @@
export { openapi } from "./openapi.js"
+export { makeQuestionHandler } from "./api/question.js"
export { api } from "./definition/api.js"
export { questionApi, QuestionReply, QuestionRequest } from "./definition/question.js"
export type { OpenApiSpec, ServerApi } from "./types.js"
+export type { QuestionOps } from "./api/question.js"