/** * Public request, value, and failure vocabulary for per-message feedback. * This module contains types only so generated Remote clients can consume it * without importing Host runtime code. * @module @deepseek-ai/dsh-message-feedback/types */ import type { Branded } from '@deepseek-ai/dsh-brand' import type { MessageId } from '@deepseek-ai/dsh-llm/brand' import type { SessionId } from '@deepseek-ai/dsh-session/types' /** Opaque compare-and-set token for one exact feedback item revision. */ export type MessageFeedbackVersion = Branded<'MessageFeedbackVersion'> /** The human's overall judgment of one assistant message. */ export type MessageFeedbackRating = 'positive' | 'negative' /** One current feedback value and its opaque mutation token. */ export interface MessageFeedbackItem { /** Stable identity of the assistant message inside the owning Session. */ readonly messageId: MessageId /** Overall positive or negative judgment. */ readonly rating: MessageFeedbackRating /** Optional explanation, preserved verbatim after validation. */ readonly note?: string /** Equality-only token replaced by every material create or update. */ readonly version: MessageFeedbackVersion /** Host-assigned creation time in Unix epoch milliseconds. */ readonly createdAt: number /** Host-assigned time of the most recent material update. */ readonly updatedAt: number } /** Read all message feedback belonging to one persisted Session lifecycle. */ export interface MessageFeedbackListRequest { /** Persisted Session whose sidecar should be read. */ readonly sessionId: SessionId } /** Current feedback values for one Session, in first-creation order. */ export interface MessageFeedbackListValue { /** Fresh immutable item snapshots. */ readonly items: readonly MessageFeedbackItem[] } /** Create or replace feedback for one assistant message. */ export interface MessageFeedbackPutRequest { /** Persisted Session that owns the target message. */ readonly sessionId: SessionId /** Target assistant-message identity. */ readonly messageId: MessageId /** Desired overall judgment. */ readonly rating: MessageFeedbackRating /** Optional non-blank explanation. */ readonly note?: string /** Observed item version, or `null` to require that no item exists. */ readonly ifVersion: MessageFeedbackVersion | null } /** Delete feedback for one message after observing its current version. */ export interface MessageFeedbackDeleteRequest { /** Persisted Session that owns the sidecar. */ readonly sessionId: SessionId /** Message whose feedback should be absent after this operation. */ readonly messageId: MessageId /** Observed item version; ignored when the item is already absent. */ readonly ifVersion: MessageFeedbackVersion } /** Idempotent deletion acknowledgement. */ export interface MessageFeedbackDeleteValue { /** Stable postcondition shared by the first deletion and every retry. */ readonly absent: true } /** No persisted Session header exists for the requested id. */ export interface MessageFeedbackSessionNotFound { readonly code: 'session-not-found' readonly sessionId: SessionId } /** The id does not name a derived, append-origin assistant message. */ export interface MessageFeedbackTargetNotFound { readonly code: 'target-not-found' readonly sessionId: SessionId readonly messageId: MessageId } /** A material mutation did not match the addressed item's current version. */ export interface MessageFeedbackVersionConflict { readonly code: 'version-conflict' /** Authoritative current item, or `null` when it does not exist. */ readonly current: MessageFeedbackItem | null } /** A supplied note contains no non-whitespace character. */ export interface MessageFeedbackNoteBlank { readonly code: 'note-blank' } /** A supplied note exceeds the configured UTF-8 byte limit. */ export interface MessageFeedbackNoteTooLarge { readonly code: 'note-too-large' readonly maxBytes: number readonly actualBytes: number } /** Failures shared by the public message-feedback operations. */ export type MessageFeedbackFailure = | MessageFeedbackSessionNotFound | MessageFeedbackTargetNotFound | MessageFeedbackVersionConflict | MessageFeedbackNoteBlank | MessageFeedbackNoteTooLarge /** Successful public operation result. */ export interface MessageFeedbackSuccess { readonly ok: true readonly value: T } /** Rejected public operation result with a stable business failure. */ export interface MessageFeedbackRejected { readonly ok: false readonly error: E } /** Result returned by the message-feedback `list` operation. */ export type MessageFeedbackListResult = | MessageFeedbackSuccess | MessageFeedbackRejected /** Result returned by the message-feedback `put` operation. */ export type MessageFeedbackPutResult = | MessageFeedbackSuccess | MessageFeedbackRejected< | MessageFeedbackSessionNotFound | MessageFeedbackTargetNotFound | MessageFeedbackVersionConflict | MessageFeedbackNoteBlank | MessageFeedbackNoteTooLarge > /** Result returned by the message-feedback `delete` operation. */ export type MessageFeedbackDeleteResult = | MessageFeedbackSuccess | MessageFeedbackRejected