2750
// eslint-disable-next-line @typescript-eslint/no-explicit-any, local/code-no-any-casts
2751
if (raw.response || raw.result || (raw as any).responseErrorDetails) {
2752
>
const agent = (raw.agent && 'metadata' in raw.agent) ? // Check for the new format, ignore entries in the old format
chatModel.ts
2753
>
reviveSerializedAgent(raw.agent) : undefined;
2754
>
2755
>
// Port entries from old format
2756
>
const result = 'responseErrorDetails' in raw ?
2757
// eslint-disable-next-line local/code-no-dangerous-type-assertions
2758
>
{ errorDetails: raw.responseErrorDetails } as IChatAgentResult : raw.result;
chatModel.ts
2759
>
let modelState = raw.modelState || { value: raw.isCanceled ? ResponseModelState.Cancelled : ResponseModelState.Complete, completedAt: Date.now() };
2760
>
if (modelState.value === ResponseModelState.Pending || modelState.value === ResponseModelState.NeedsInput) {
2761
modelState = { value: ResponseModelState.Cancelled, completedAt: Date.now() };
2762
}
2764
>
// Mark question carousels as used after
2765
>
// deserialization. After a reload, the extension is no longer listening for
2766
>
// their responses, so they cannot be interacted with.
2767
>
if (raw.response) {
2768
>
for (const part of raw.response) {
2769
if (hasKey(part, { kind: true }) && (part.kind === 'questionCarousel' || part.kind === 'planReview')) {
2770
part.isUsed = true;
2771
}
2772
}
2774
>
2775
>
request.response = new ChatResponseModel({
2776
>
responseContent: raw.response ?? [new MarkdownString(raw.response)],
2777
>
session: this,
2778
>
agent,
2779
>
slashCommand: raw.slashCommand,
2780
>
requestId: request.id,
2781
>
modelState,
2782
>
completionTimestamp: raw.modelState && 'completedAt' in raw.modelState && Number.isFinite(raw.modelState.completedAt) && raw.modelState.completedAt > 0
2783
? raw.modelState.completedAt
2784
: null,
2786
>
timestamp: typeof raw.responseTimestamp === 'number' && raw.responseTimestamp > 0 ? raw.responseTimestamp : requestTimestamp,
2787
>
result,
2788
>
followups: raw.followups,
2789
>
restoredId: raw.responseId,
2790
>
timeSpentWaiting: raw.timeSpentWaiting,
2791
>
elapsedMs: raw.elapsedMs,
2792
>
shouldBeBlocked: request.shouldBeBlocked.get(),
2793
>
codeBlockInfos: raw.responseMarkdownInfo?.map<ICodeBlockInfo>(info => ({ suggestionId: info.suggestionId })),
2794
>
});
2795
>
request.response.shouldBeRemovedOnSend = raw.isHidden ? { requestId: raw.requestId } : raw.shouldBeRemovedOnSend;
2796
>
if (typeof raw.completionTokens === 'number' || typeof raw.promptTokens === 'number' || typeof raw.copilotCredits === 'number') {
2797
request.response.setUsage({
2798
kind: 'usage',