845
* possible) and by {@link getSessionMetadata} (which layers on async stats).
846
*/
847
>
function getSessionMetadataSync(session: ChatModel): IChatSessionEntryMetadata {
chatSessionStore.ts
848
>
const title = session.customTitle || session.title;
849
>
850
>
let lastResponseState = session.lastRequest?.response?.state ?? ResponseModelState.Complete;
851
>
if (lastResponseState === ResponseModelState.Pending || lastResponseState === ResponseModelState.NeedsInput) {
852
lastResponseState = ResponseModelState.Cancelled;
853
}
855
>
const isExternal = !LocalChatSessionUri.parseLocalSessionId(session.sessionResource);
856
>
const rawInputState = isExternal ? session.inputModel.toJSON() : undefined;
857
>
const inputState = rawInputState ? { ...rawInputState, attachments: [] } : undefined;
858
>
859
>
return {
860
>
sessionId: session.sessionId,
861
>
title: title || localize('newChat', "New Chat"),
862
>
lastMessageDate: session.lastMessageDate,
863
>
timing: session.timing,
864
>
initialLocation: session.initialLocation,
865
>
hasPendingEdits: session.editingSession?.entries.get().some(e => e.state.get() === ModifiedFileEntryState.Modified) ?? false,
866
>
isEmpty: session.getRequests().length === 0,
867
>
isExternal,
868
>
lastResponseState,
869
>
permissionLevel: session.inputModel.state.get()?.permissionLevel,
870
>
inputState,
871
>
workingDirectory: session.workingDirectory?.toString(),
872
>
};
873
>
}
874
875
async function getSessionMetadata(session: ChatModel | ISerializableChatData): Promise<IChatSessionEntryMetadata> {
876
if (session instanceof ChatModel) {
878
>
metadata.stats = await awaitStatsForSession(session);
879
>
return metadata;
880
>
}
881
882
// ISerializableChatData — only used in the old pre-fs storage data migration scenario