import * as Schema from "effect/Schema";
import { EnvironmentId, MessageId, NonNegativeInt, ThreadId } from "./baseSchemas.ts";
export const ASSISTANT_CITATION_MAX_TEXT_LENGTH = 8_000;
export const ASSISTANT_CITATION_MAX_COMMENT_LENGTH = 8_000;
export const ASSISTANT_CITATION_CONTEXT_LENGTH = 32;
/**
* A quote of rendered assistant text with an optional user comment.
* Positions are UTF-16 offsets, not Markdown offsets.
*/
export const AssistantCitation = Schema.Struct({
version: Schema.Literal(1),
environmentId: EnvironmentId.check(Schema.isMaxLength(512)),
threadId: ThreadId.check(Schema.isMaxLength(512)),
messageId: MessageId.check(Schema.isMaxLength(512)),
text: Schema.String.check(
Schema.isNonEmpty(),
Schema.isMaxLength(ASSISTANT_CITATION_MAX_TEXT_LENGTH),
),
comment: Schema.optional(
Schema.String.check(Schema.isMaxLength(ASSISTANT_CITATION_MAX_COMMENT_LENGTH)),
),
start: NonNegativeInt.check(Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER)),
end: NonNegativeInt.check(Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER)),
prefix: Schema.String.check(Schema.isMaxLength(ASSISTANT_CITATION_CONTEXT_LENGTH)),
suffix: Schema.String.check(Schema.isMaxLength(ASSISTANT_CITATION_CONTEXT_LENGTH)),
}).check(
Schema.makeFilter((citation) => citation.end > citation.start && citation.text.trim().length > 0),
);
export type AssistantCitation = typeof AssistantCitation.Type;