@gendive/chatllm 0.17.23 → 0.17.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2801,6 +2801,26 @@ ${attachmentContext}
2801
2801
  } catch {
2802
2802
  }
2803
2803
  }
2804
+ const saveMessagesOnEarlyReturn = () => {
2805
+ if (!useExternalStorage || !capturedSessionId) return;
2806
+ queueMicrotask(() => {
2807
+ const latestSession = sessionsRef.current.find((s) => s.id === capturedSessionId);
2808
+ if (!latestSession) return;
2809
+ const latestMessages = latestSession.messages;
2810
+ const assistantMsg = [...latestMessages].reverse().find((m) => m.role === "assistant");
2811
+ const userMsg = latestMessages.find((m) => m.role === "user" && m.content === finalContent);
2812
+ const assistantContent = assistantMsg?.content || "";
2813
+ if (assistantContent && onSaveMessagesRef.current) {
2814
+ onSaveMessagesRef.current(capturedSessionId, [
2815
+ { role: "user", message: finalContent, ...userMsg?.contentParts && { contentParts: userMsg.contentParts } },
2816
+ { role: "assistant", message: assistantContent, ...assistantMsg?.contentParts && { contentParts: assistantMsg.contentParts } }
2817
+ ]).catch((e) => console.error("[useChatUI] Failed to save messages:", e));
2818
+ }
2819
+ if (latestSession.messages.length > 0) {
2820
+ writeSessionCache(storageKey, latestSession);
2821
+ }
2822
+ });
2823
+ };
2804
2824
  if (!shouldSkipSkillParsing) {
2805
2825
  const assistantContent = accumulatedContent;
2806
2826
  const { skillCall: detectedSkill, cleanContent: skillCleanContent } = parseSkillCallFromContent(assistantContent);
@@ -2904,6 +2924,7 @@ ${attachmentContext}
2904
2924
  })
2905
2925
  );
2906
2926
  if (resultType === "image" || resultType === "file") {
2927
+ saveMessagesOnEarlyReturn();
2907
2928
  setIsLoading(false);
2908
2929
  abortControllerRef.current = null;
2909
2930
  return;
@@ -2914,11 +2935,13 @@ ${attachmentContext}
2914
2935
  shouldContinue = decision === "continue";
2915
2936
  }
2916
2937
  if (!shouldContinue) {
2938
+ saveMessagesOnEarlyReturn();
2917
2939
  setIsLoading(false);
2918
2940
  abortControllerRef.current = null;
2919
2941
  return;
2920
2942
  }
2921
2943
  skipNextSkillParsingRef.current = true;
2944
+ saveMessagesOnEarlyReturn();
2922
2945
  const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
2923
2946
 
2924
2947
  \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958\uB97C \uC548\uB0B4\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.` : `\uB3C4\uAD6C "${toolName}" \uACB0\uACFC:
@@ -2954,6 +2977,7 @@ ${result.content}
2954
2977
  })
2955
2978
  );
2956
2979
  if (streamedReport) {
2980
+ saveMessagesOnEarlyReturn();
2957
2981
  setIsLoading(false);
2958
2982
  abortControllerRef.current = null;
2959
2983
  return;
@@ -2964,11 +2988,13 @@ ${result.content}
2964
2988
  shouldContinueSkill = decision === "continue";
2965
2989
  }
2966
2990
  if (!shouldContinueSkill) {
2991
+ saveMessagesOnEarlyReturn();
2967
2992
  setIsLoading(false);
2968
2993
  abortControllerRef.current = null;
2969
2994
  return;
2970
2995
  }
2971
2996
  skipNextSkillParsingRef.current = true;
2997
+ saveMessagesOnEarlyReturn();
2972
2998
  const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
2973
2999
 
2974
3000
  ${result.content}
@@ -6505,6 +6531,7 @@ var MarkdownRenderer = ({
6505
6531
  if (hasUnfinishedPoll) {
6506
6532
  processedContent += "\n\xA7POLL_LOADING\xA7";
6507
6533
  }
6534
+ processedContent = processedContent.replace(/<skill_use[^>]*>[\s\S]*?<\/skill_use>/gi, "");
6508
6535
  processedContent = processedContent.replace(UNCLOSED_SKILL_TAG_REGEX, "");
6509
6536
  const codeBlocks = [];
6510
6537
  processedContent = processedContent.replace(CODE_BLOCK_REGEX, (match, lang, code) => {