/
Alex_Ural
/
opencode
Обзор
Документация
Войти
/
Alex_Ural
/
opencode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
packages/schema/src/v1/question.ts
66 строк
3 KB
Kit Langton
refactor(schema): isolate v1 contracts (#33769)
25 июн 2026, 20:26
Не верифицирован
25 июн 2026, 20:26
a267222
Код
Авторство
О чём код?
export * as QuestionV1 from "./question" import { Schema } from "effect" import { define, inventory } from "../event" import { ascending } from "../identifier" import { statics } from "../schema" import { SessionID } from "../session-id" import { SessionV1 } from "./session" export const ID = Schema.String.check(Schema.isStartsWith("que")).pipe( Schema.brand("QuestionID"), statics((schema) => ({ ascending: (id?: string) => schema.make(id ?? "que_" + ascending()) })), ) export const Option = Schema.Struct({ label: Schema.String.annotate({ description: "Display text (1-5 words, concise)" }), description: Schema.String.annotate({ description: "Explanation of choice" }), }).annotate({ identifier: "QuestionOption" }) const base = { question: Schema.String.annotate({ description: "Complete question" }), header: Schema.String.annotate({ description: "Very short label (max 30 chars)" }), options: Schema.Array(Option).annotate({ description: "Available choices" }), multiple: Schema.optional(Schema.Boolean).annotate({ description: "Allow selecting multiple choices" }), } export const Info = Schema.Struct({ ...base, custom: Schema.optional(Schema.Boolean).annotate({ description: "Allow typing a custom answer (default: true)" }), }).annotate({ identifier: "QuestionInfo" }) export const Prompt = Schema.Struct(base).annotate({ identifier: "QuestionPrompt" }) export const Tool = Schema.Struct({ messageID: SessionV1.MessageID, callID: Schema.String }).annotate({ identifier: "QuestionTool", }) export const Request = Schema.Struct({ id: ID, sessionID: SessionID, questions: Schema.Array(Info).annotate({ description: "Questions to ask" }), tool: Schema.optional(Tool), }).annotate({ identifier: "QuestionRequest" }) export const Answer = Schema.Array(Schema.String).annotate({ identifier: "QuestionAnswer" }) export const Reply = Schema.Struct({ answers: Schema.Array(Answer).annotate({ description: "User answers in order of questions (each answer is an array of selected labels)", }), }).annotate({ identifier: "QuestionReply" }) export const Replied = Schema.Struct({ sessionID: SessionID, requestID: ID, answers: Schema.Array(Answer), }).annotate({ identifier: "QuestionReplied", }) export const Rejected = Schema.Struct({ sessionID: SessionID, requestID: ID }).annotate({ identifier: "QuestionRejected", }) const Asked = define({ type: "question.asked", schema: Request.fields }) const RepliedEvent = define({ type: "question.replied", schema: Replied.fields }) const RejectedEvent = define({ type: "question.rejected", schema: Rejected.fields }) export const Event = { Asked, Replied: RepliedEvent, Rejected: RejectedEvent, Definitions: inventory(Asked, RepliedEvent, RejectedEvent), }