Files
openchamber/packages/ui/src/lib/contextObligatoryMessages.ts
T

49 lines
1.7 KiB
TypeScript
Raw Normal View History

import type { Session } from '@opencode-ai/sdk/v2';
import { getSessionMetadata, type SessionMetadataRecord } from './sessionReviewMetadata';
export type ContextObligatoryMessage = {
id: string;
createdAt: number;
role: 'user' | 'assistant';
};
const isRecord = (value: unknown): value is Record<string, unknown> =>
Boolean(value && typeof value === 'object' && !Array.isArray(value));
export const getContextObligatoryMessages = (
session: Session | null | undefined,
): ContextObligatoryMessage[] => {
const openchamber = getSessionMetadata(session).openchamber;
if (!isRecord(openchamber) || !Array.isArray(openchamber.context_obligatory_messages)) return [];
return openchamber.context_obligatory_messages.filter((value): value is ContextObligatoryMessage =>
isRecord(value)
&& typeof value.id === 'string'
&& typeof value.createdAt === 'number'
&& Number.isFinite(value.createdAt)
&& (value.role === 'user' || value.role === 'assistant'));
};
export const withContextObligatoryMessage = (
metadata: SessionMetadataRecord,
message: ContextObligatoryMessage,
pinned: boolean,
): SessionMetadataRecord => {
const openchamber = isRecord(metadata.openchamber) ? metadata.openchamber : {};
const current = Array.isArray(openchamber.context_obligatory_messages)
? openchamber.context_obligatory_messages.filter((value): value is ContextObligatoryMessage =>
isRecord(value) && typeof value.id === 'string')
: [];
const withoutMessage = current.filter((value) => value.id !== message.id);
const nextMessages = pinned ? [...withoutMessage, message] : withoutMessage;
return {
...metadata,
openchamber: {
...openchamber,
context_obligatory_messages: nextMessages,
},
};
};