49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
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,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
};
|