Files
OpenMAIC/lib/runtime/payload-validators.ts
T
fc66cc0603 feat(runtime): add learner whiteboard RuntimeStore foundation (#1075)
* feat(runtime): add whiteboard RuntimeStore foundation

* Potential fix for pull request finding 'Comparison between inconvertible types'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* fix(runtime): reject invalid whiteboard appends before commit

* fix(runtime): preserve special JSON keys during canonical clone

* Potential fix for pull request finding 'Invalid prototype value'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* feat(runtime): add minimal learner whiteboard mutation

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: wyuc <wang-yc24@mails.tsinghua.edu.cn>
2026-08-09 12:32:28 -04:00

38 lines
1.1 KiB
TypeScript

import { isChatMessageSkeleton, isQuizAttemptSkeleton } from '@openmaic/dsl';
import type { RuntimePayloadValidator } from '@openmaic/storage';
import { whiteboardRuntimePayloadValidator } from '@/lib/whiteboard/runtime/validate';
const chat: RuntimePayloadValidator = (payload) =>
isChatMessageSkeleton(payload)
? { valid: true }
: {
valid: false,
errors: [
{
path: '/payload',
message: 'chat payload must match ChatMessageSkeleton (role + content)',
},
],
};
const quizAttempt: RuntimePayloadValidator = (payload) =>
isQuizAttemptSkeleton(payload)
? { valid: true }
: {
valid: false,
errors: [
{
path: '/payload',
message: 'quizAttempt payload must match QuizAttemptSkeleton (phase + answers)',
},
],
};
/** Complete app validator table. RuntimeStore options replace their defaults. */
export const APP_RUNTIME_PAYLOAD_VALIDATORS = Object.freeze({
chat,
quizAttempt,
whiteboard: whiteboardRuntimePayloadValidator,
}) satisfies Readonly<Record<string, RuntimePayloadValidator>>;