- 品牌替换:OpenCode/opencode → AirCoding/aircoding(16+ 文件) - Logo ASCII art:修复 left/right 行数不匹配导致的启动崩溃 - 启动诊断:添加 OPENCODE_PRINT_TIMING 计时探针 - dev 模式默认 --pure 跳过外部插件加载 - AGENTS.md 模板:追加 AirCoding 多 Agent 专项段落 - architect prompt + plugin:强化 AGENTS.md 产出验证
63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import { QuestionV2 } from "@opencode-ai/core/question"
|
|
import { Effect } from "effect"
|
|
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi"
|
|
import { Api } from "../api"
|
|
import { QuestionNotFoundError } from "../errors"
|
|
import { response } from "../groups/location"
|
|
|
|
function missingRequest(id: QuestionV2.ID) {
|
|
return new QuestionNotFoundError({ requestID: id, message: `Question request not found: ${id}` })
|
|
}
|
|
|
|
export const QuestionHandler = HttpApiBuilder.group(Api, "server.question", (handlers) =>
|
|
Effect.gen(function* () {
|
|
const withOwnedQuestion = Effect.fnUntraced(function* <A, E>(
|
|
sessionID: QuestionV2.Request["sessionID"],
|
|
requestID: QuestionV2.ID,
|
|
use: (question: QuestionV2.Interface) => Effect.Effect<A, E>,
|
|
) {
|
|
const question = yield* QuestionV2.Service
|
|
const request = (yield* question.list()).find((request) => request.id === requestID)
|
|
if (!request || request.sessionID !== sessionID) return yield* missingRequest(requestID)
|
|
return yield* use(question)
|
|
})
|
|
|
|
return handlers
|
|
.handle(
|
|
"question.request.list",
|
|
Effect.fn(function* () {
|
|
return yield* response((yield* QuestionV2.Service).list())
|
|
}),
|
|
)
|
|
.handle(
|
|
"session.question.list",
|
|
Effect.fn(function* (ctx) {
|
|
const requests = yield* (yield* QuestionV2.Service).list()
|
|
return { data: requests.filter((request) => request.sessionID === ctx.params.sessionID) }
|
|
}),
|
|
)
|
|
.handle(
|
|
"session.question.reply",
|
|
Effect.fn(function* (ctx) {
|
|
yield* withOwnedQuestion(ctx.params.sessionID, ctx.params.requestID, (question) =>
|
|
question
|
|
.reply({ requestID: ctx.params.requestID, answers: ctx.payload.answers })
|
|
.pipe(Effect.catchTag("QuestionV2.NotFoundError", () => missingRequest(ctx.params.requestID))),
|
|
)
|
|
return HttpApiSchema.NoContent.make()
|
|
}),
|
|
)
|
|
.handle(
|
|
"session.question.reject",
|
|
Effect.fn(function* (ctx) {
|
|
yield* withOwnedQuestion(ctx.params.sessionID, ctx.params.requestID, (question) =>
|
|
question
|
|
.reject(ctx.params.requestID)
|
|
.pipe(Effect.catchTag("QuestionV2.NotFoundError", () => missingRequest(ctx.params.requestID))),
|
|
)
|
|
return HttpApiSchema.NoContent.make()
|
|
}),
|
|
)
|
|
}),
|
|
)
|